示例#1
0
static void
peerDigestSwapInCBlock(void *data, mem_node_ref nr, ssize_t size)
{
    const char *buf = nr.node->data + nr.offset;
    DigestFetchState *fetch = data;

    if (peerDigestFetchedEnough(fetch, size, "peerDigestSwapInCBlock"))
	goto finish;

    fetch->offset += size;
    memcpy(fetch->buf + fetch->buf_used, buf, size);
    fetch->buf_used += size;

    if (fetch->buf_used >= StoreDigestCBlockSize) {
	PeerDigest *pd = fetch->pd;
	HttpReply *rep = fetch->entry->mem_obj->reply;

	assert(pd && rep);
	if (peerDigestSetCBlock(pd, fetch->buf)) {
	    /* XXX: soon we will have variable header size */
	    fetch->offset -= fetch->buf_used - StoreDigestCBlockSize;
	    /* switch to CD buffer and fetch digest guts */
	    memFree(fetch->buf, MEM_4K_BUF);
	    fetch->buf = NULL;
	    fetch->buf_used = 0;
	    assert(pd->cd->mask);
	    storeClientRef(fetch->sc, fetch->entry,
		fetch->offset,
		fetch->offset,
		pd->cd->mask_size,
		peerDigestSwapInMask, fetch);
	} else {
	    peerDigestFetchAbort(fetch, "invalid digest cblock");
	}
    } else {
	/* need more data, do we have space? */
	if (fetch->buf_used >= SM_PAGE_SIZE)
	    peerDigestFetchAbort(fetch, "digest cblock too big");
	else
	    storeClientRef(fetch->sc, fetch->entry, fetch->offset, fetch->offset, SM_PAGE_SIZE - fetch->buf_used,
		peerDigestSwapInCBlock, fetch);
    }
  finish:
    stmemNodeUnref(&nr);
}
示例#2
0
static void
peerDigestSwapInCBlock(void *data, char *buf, ssize_t size)
{
    DigestFetchState *fetch = data;

    if (peerDigestFetchedEnough(fetch, buf, size, "peerDigestSwapInCBlock"))
	return;

    if (size >= StoreDigestCBlockSize) {
	PeerDigest *pd = fetch->pd;
	HttpReply *rep = fetch->entry->mem_obj->reply;
	const int seen = fetch->offset + size;

	assert(pd && rep);
	if (peerDigestSetCBlock(pd, buf)) {
	    /* XXX: soon we will have variable header size */
	    fetch->offset += StoreDigestCBlockSize;
	    /* switch to CD buffer and fetch digest guts */
	    memFree(buf, MEM_4K_BUF);
	    buf = NULL;
	    assert(pd->cd->mask);
	    storeClientCopy(fetch->entry,
		seen,
		fetch->offset,
		pd->cd->mask_size,
		pd->cd->mask,
		peerDigestSwapInMask, fetch);
	} else {
	    peerDigestFetchAbort(fetch, buf, "invalid digest cblock");
	}
    } else {
	/* need more data, do we have space? */
	if (size >= SM_PAGE_SIZE)
	    peerDigestFetchAbort(fetch, buf, "digest cblock too big");
	else
	    storeClientCopy(fetch->entry, size, 0, SM_PAGE_SIZE, buf,
		peerDigestSwapInCBlock, fetch);
    }
}