static void setup_reads_from_slist_blks(struct asfd *asfd, int *ar, struct slist *slist, int number_of_blks, uint64_t interrupt) { struct sbuf *s; struct blk blk; struct iobuf iobuf; uint64_t file_no=1; if(!slist) return; for(s=slist->head; s; s=s->next) { if(sbuf_is_filedata(s) && !sbuf_is_encrypted(s)) // Not working for proto2 yet. { int b; if(interrupt==file_no++) continue; blk_to_iobuf_sig(&blk, &iobuf); for(b=0; b<number_of_blks; b++) { iobuf_from_str(&iobuf, CMD_DATA, (char *)"some data"); asfd_mock_read_iobuf(asfd, ar, 0, &iobuf); } } } }
static int append_for_champ_chooser(struct asfd *chfd, struct blist *blist, int end_flags) { static int finished_sending=0; static struct iobuf wbuf; static struct blk *blk=NULL; while(blist->blk_for_champ_chooser) { blk=blist->blk_for_champ_chooser; // If we send too many blocks to the champ chooser at once, // it can go faster than we can send paths to completed // manifests to it. This means that deduplication efficiency // is reduced (although speed may be faster). // So limit the sending. if(blk->index - blist->head->index > MANIFEST_SIG_MAX) return 0; blk_to_iobuf_sig(blk, &wbuf); switch(chfd->append_all_to_write_buffer(chfd, &wbuf)) { case APPEND_OK: break; case APPEND_BLOCKED: return 0; // Try again later. default: return -1; } blist->blk_for_champ_chooser=blk->next; } if(end_flags&END_SIGS && !finished_sending && !blist->blk_for_champ_chooser) { iobuf_from_str(&wbuf, CMD_GEN, (char *)"sigs_end"); switch(chfd->append_all_to_write_buffer(chfd, &wbuf)) { case APPEND_OK: break; case APPEND_BLOCKED: return 0; // Try again later. default: return -1; } finished_sending++; } return 0; }
static void setup_reads_from_slist(struct asfd *asfd, int *ar, struct slist *slist, int number_of_blks, uint64_t interrupt) { int file_no=1; struct sbuf *s; struct blk blk; struct iobuf iobuf; if(!slist) return; for(s=slist->head; s; s=s->next) { if(sbuf_is_filedata(s) && !sbuf_is_encrypted(s)) // Not working for proto2 yet. { int b; s->protocol2->index=file_no++; if(interrupt==s->protocol2->index) { char buf[32]=""; asfd_mock_read(asfd, ar, 0, CMD_WARNING, "path vanished\n"); base64_from_uint64(interrupt, buf); asfd_mock_read(asfd, ar, 0, CMD_INTERRUPT, buf); continue; } iobuf_free_content(&s->attr); attribs_encode(s); asfd_mock_read(asfd, ar, 0, CMD_ATTRIBS_SIGS, s->attr.buf); blk.fingerprint=file_no; memset(&blk.md5sum, file_no, MD5_DIGEST_LENGTH); blk_to_iobuf_sig(&blk, &iobuf); for(b=0; b<number_of_blks; b++) asfd_mock_read_iobuf(asfd, ar, 0, &iobuf); } } }
static void setup_chfd_writes_from_slist(struct asfd *chfd, int *cw, struct slist *slist, int number_of_blks, uint64_t interrupt) { struct sbuf *s; struct blk blk; struct iobuf iobuf; uint64_t file_no=1; if(!slist) return; for(s=slist->head; s; s=s->next) { if(sbuf_is_filedata(s) && !sbuf_is_encrypted(s)) // Not working for proto2 yet. { int b; if(interrupt==file_no++) continue; blk.fingerprint=file_no; memset(&blk.md5sum, file_no, MD5_DIGEST_LENGTH); blk_to_iobuf_sig(&blk, &iobuf); for(b=0; b<number_of_blks; b++) asfd_assert_write_iobuf(chfd, cw, 0, &iobuf); } } }
static int iobuf_from_blk_data(struct iobuf *wbuf, struct blk *blk) { if(blk_md5_update(blk)) return -1; blk_to_iobuf_sig(blk, wbuf); return 0; }