*
*/
/*
- Copyright (C) 2000-2005 Kern Sibbald
+ Copyright (C) 2000-2006 Kern Sibbald
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
#else
crypto_digest_t signing_algorithm = CRYPTO_DIGEST_SHA1;
#endif
- BSOCK *sd;
JCR *jcr = (JCR *)vjcr;
+ BSOCK *sd = jcr->store_bsock;
if (job_canceled(jcr)) {
return 0;
}
- sd = jcr->store_bsock;
jcr->num_files_examined++; /* bump total file count */
switch (ff_pkt->type) {
Dmsg2(130, "FT_LNK saving: %s -> %s\n", ff_pkt->fname, ff_pkt->link);
break;
case FT_DIRBEGIN:
+ jcr->num_files_examined--; /* correct file count */
return 1; /* not used */
case FT_NORECURSE:
Jmsg(jcr, M_INFO, 1, _(" Recursion turned off. Will not descend into %s\n"),
wbuf = jcr->compress_buf; /* compressed output here */
cipher_input = jcr->compress_buf; /* encrypt compressed data */
}
+#else
+ const uint32_t max_compress_len = 0;
#endif
if (ff_pkt->flags & FO_ENCRYPT) {
/* Allocate the cipher context */
if ((cipher_ctx = crypto_cipher_new(jcr->pki_session, true, &cipher_block_size)) == NULL) {
/* Shouldn't happen! */
- Jmsg0(jcr, M_FATAL, 0, _("Failed to initialize encryption context"));
+ Jmsg0(jcr, M_FATAL, 0, _("Failed to initialize encryption context\n"));
goto err;
}
if (S_ISBLK(ff_pkt->statp.st_mode))
rsize = (rsize/512) * 512;
#endif
+
+#ifdef HAVE_LIBZ
+ /*
+ * instead of using compress2 for every block (with 256KB alloc + free per block)
+ * we init the zlib once per file which leads to less pagefaults on large files (>64K)
+ */
+
+ z_stream zstream;
+ zstream.zalloc = Z_NULL;
+ zstream.zfree = Z_NULL;
+ zstream.opaque = Z_NULL;
+ zstream.state = Z_NULL;
+
+ BOOL blibzInited = deflateInit(&zstream, ff_pkt->GZIP_level) == Z_OK;
+#endif
/*
* Read the file data
#ifdef HAVE_LIBZ
/* Do compression if turned on */
- if (!sparseBlock && ff_pkt->flags & FO_GZIP) {
+ if (!sparseBlock && (ff_pkt->flags & FO_GZIP) && blibzInited) {
int zstat;
compress_len = max_compress_len;
Dmsg4(400, "cbuf=0x%x len=%u rbuf=0x%x len=%u\n", cbuf, compress_len,
rbuf, sd->msglen);
- /* NOTE! This call modifies compress_len !!! */
- if ((zstat=compress2((Bytef *)cbuf, &compress_len,
- (const Bytef *)rbuf, (uLong)sd->msglen,
- ff_pkt->GZIP_level)) != Z_OK) {
+
+ zstream.next_in = (Bytef *)rbuf;
+ zstream.avail_in = sd->msglen;
+ zstream.next_out = (Bytef *)cbuf;
+ zstream.avail_out = compress_len;
+
+ if ((zstat=deflate(&zstream, Z_FINISH)) != Z_STREAM_END) {
Jmsg(jcr, M_FATAL, 0, _("Compression error: %d\n"), zstat);
set_jcr_job_status(jcr, JS_ErrorTerminated);
goto err;
}
+ compress_len = zstream.total_out;
+ blibzInited = deflateReset(&zstream) == Z_OK;
+
Dmsg2(400, "compressed len=%d uncompressed len=%d\n",
compress_len, sd->msglen);
if (cipher_ctx) {
crypto_cipher_free(cipher_ctx);
}
+#ifdef HAVE_LIBZ
+ /* Free the zlib stream */
+ deflateEnd(&zstream);
+#endif
return 1;
err:
+ /* Free the cipher context */
if (cipher_ctx) {
crypto_cipher_free(cipher_ctx);
}
+#ifdef HAVE_LIBZ
+ /* Free the zlib stream */
+ deflateEnd(&zstream);
+#endif
+
sd->msg = msgsave; /* restore bnet buffer */
sd->msglen = 0;
return 0;
Dmsg3(300, "File %s\nattribs=%s\nattribsEx=%s\n", ff_pkt->fname, attribs, attribsEx);
- P(jcr->mutex);
+ jcr->lock();
jcr->JobFiles++; /* increment number of files sent */
ff_pkt->FileIndex = jcr->JobFiles; /* return FileIndex */
pm_strcpy(jcr->last_fname, ff_pkt->fname);
- V(jcr->mutex);
+ jcr->unlock();
/*
* Send Attributes header to Storage daemon