-
Notifications
You must be signed in to change notification settings - Fork 1.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add zstream redup
command to convert deduplicated send streams
#10156
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
zstream |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
include $(top_srcdir)/config/Rules.am | ||
|
||
sbin_PROGRAMS = zstream | ||
|
||
zstream_SOURCES = \ | ||
zstream.c \ | ||
zstream.h \ | ||
zstream_dump.c \ | ||
zstream_redup.c | ||
|
||
zstream_LDADD = \ | ||
$(top_builddir)/lib/libnvpair/libnvpair.la \ | ||
$(top_builddir)/lib/libzfs/libzfs.la |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,61 @@ | ||
/* | ||
* CDDL HEADER START | ||
* | ||
* This file and its contents are supplied under the terms of the | ||
* Common Development and Distribution License ("CDDL"), version 1.0. | ||
* You may only use this file in accordance with the terms of version | ||
* 1.0 of the CDDL. | ||
* | ||
* A full copy of the text of the CDDL should have accompanied this | ||
* source. A copy of the CDDL is also available via the Internet at | ||
* http://www.illumos.org/license/CDDL. | ||
* | ||
* CDDL HEADER END | ||
*/ | ||
|
||
/* | ||
* Copyright (c) 2020 by Delphix. All rights reserved. | ||
*/ | ||
#include <sys/types.h> | ||
#include <sys/stat.h> | ||
#include <fcntl.h> | ||
#include <ctype.h> | ||
#include <stdio.h> | ||
#include <stdlib.h> | ||
#include <strings.h> | ||
#include <unistd.h> | ||
#include <libintl.h> | ||
#include <stddef.h> | ||
#include <libzfs.h> | ||
#include "zstream.h" | ||
|
||
void | ||
zstream_usage(void) | ||
{ | ||
(void) fprintf(stderr, | ||
"usage: zstream command args ...\n" | ||
"Available commands are:\n" | ||
"\n" | ||
"\tzstream dump [-vCd] FILE\n" | ||
"\t... | zstream dump [-vCd]\n" | ||
"\n" | ||
"\tzstream redup [-v] FILE | ...\n"); | ||
exit(1); | ||
} | ||
|
||
int | ||
main(int argc, char *argv[]) | ||
{ | ||
if (argc < 2) | ||
zstream_usage(); | ||
|
||
char *subcommand = argv[1]; | ||
|
||
if (strcmp(subcommand, "dump") == 0) { | ||
return (zstream_do_dump(argc - 1, argv + 1)); | ||
} else if (strcmp(subcommand, "redup") == 0) { | ||
return (zstream_do_redup(argc - 1, argv + 1)); | ||
} else { | ||
zstream_usage(); | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
/* | ||
* CDDL HEADER START | ||
* | ||
* This file and its contents are supplied under the terms of the | ||
* Common Development and Distribution License ("CDDL"), version 1.0. | ||
* You may only use this file in accordance with the terms of version | ||
* 1.0 of the CDDL. | ||
* | ||
* A full copy of the text of the CDDL should have accompanied this | ||
* source. A copy of the CDDL is also available via the Internet at | ||
* http://www.illumos.org/license/CDDL. | ||
* | ||
* CDDL HEADER END | ||
*/ | ||
|
||
/* | ||
* Copyright (c) 2020 by Delphix. All rights reserved. | ||
*/ | ||
|
||
#ifndef _ZSTREAM_H | ||
#define _ZSTREAM_H | ||
|
||
#ifdef __cplusplus | ||
extern "C" { | ||
#endif | ||
|
||
extern int zstream_do_redup(int, char *[]); | ||
extern int zstream_do_dump(int, char *[]); | ||
extern void zstream_usage(void); | ||
|
||
#ifdef __cplusplus | ||
} | ||
#endif | ||
|
||
#endif /* _ZSTREAM_H */ |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -42,6 +42,7 @@ | |
#include <sys/zfs_ioctl.h> | ||
#include <sys/zio.h> | ||
#include <zfs_fletcher.h> | ||
#include "zstream.h" | ||
|
||
/* | ||
* If dump mode is enabled, the number of bytes to print per line | ||
|
@@ -58,17 +59,6 @@ FILE *send_stream = 0; | |
boolean_t do_byteswap = B_FALSE; | ||
boolean_t do_cksum = B_TRUE; | ||
|
||
static void | ||
usage(void) | ||
{ | ||
(void) fprintf(stderr, "usage: zstreamdump [-v] [-C] [-d] < file\n"); | ||
(void) fprintf(stderr, "\t -v -- verbose\n"); | ||
(void) fprintf(stderr, "\t -C -- suppress checksum verification\n"); | ||
(void) fprintf(stderr, "\t -d -- dump contents of blocks modified, " | ||
"implies verbose\n"); | ||
exit(1); | ||
} | ||
|
||
static void * | ||
safe_malloc(size_t size) | ||
{ | ||
|
@@ -215,7 +205,7 @@ sprintf_bytes(char *str, uint8_t *buf, uint_t buf_len) | |
} | ||
|
||
int | ||
main(int argc, char *argv[]) | ||
zstream_do_dump(int argc, char *argv[]) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Did you decide to have the zstream_do_* functions in separate files for this just because zstreamdump was already its own utility, or do you think this is a better design for things like zfs_do_* and zpool_do_* as well? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. For this case, it worked especially well because zstreamdump was already in its own file, and also the |
||
{ | ||
char *buf = safe_malloc(SPA_MAXBLOCKSIZE); | ||
uint64_t drr_record_count[DRR_NUMTYPES] = { 0 }; | ||
|
@@ -273,26 +263,39 @@ main(int argc, char *argv[]) | |
case ':': | ||
(void) fprintf(stderr, | ||
"missing argument for '%c' option\n", optopt); | ||
usage(); | ||
zstream_usage(); | ||
break; | ||
case '?': | ||
(void) fprintf(stderr, "invalid option '%c'\n", | ||
optopt); | ||
usage(); | ||
zstream_usage(); | ||
break; | ||
} | ||
} | ||
|
||
if (isatty(STDIN_FILENO)) { | ||
(void) fprintf(stderr, | ||
"Error: Backup stream can not be read " | ||
"from a terminal.\n" | ||
"You must redirect standard input.\n"); | ||
exit(1); | ||
if (argc > optind) { | ||
const char *filename = argv[optind]; | ||
send_stream = fopen(filename, "r"); | ||
if (send_stream == NULL) { | ||
(void) fprintf(stderr, | ||
"Error while opening file '%s': %s\n", | ||
filename, strerror(errno)); | ||
exit(1); | ||
} | ||
} else { | ||
if (isatty(STDIN_FILENO)) { | ||
(void) fprintf(stderr, | ||
"Error: The send stream is a binary format " | ||
"and can not be read from a\n" | ||
"terminal. Standard input must be redirected, " | ||
"or a file must be\n" | ||
"specified as a command-line argument.\n"); | ||
exit(1); | ||
} | ||
send_stream = stdin; | ||
} | ||
|
||
fletcher_4_init(); | ||
send_stream = stdin; | ||
while (read_hdr(drr, &zc)) { | ||
|
||
/* | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: Double blank line