MFV r337014:
9421 zdb should detect and print out the number of "leaked" objects 9422 zfs diff and zdb should explicitly mark objects that are on the deleted queue illumos/illumos-gate@20b5dafb42 Reviewed by: Matt Ahrens <matt@delphix.com> Reviewed by: Pavel Zakharov <pavel.zakharov@delphix.com> Approved by: Matt Ahrens <mahrens@delphix.com> Author: Paul Dagnelie <pcd@delphix.com>
This commit is contained in:
commit
200c27a75d
@ -108,6 +108,7 @@ static uint64_t *zopt_object = NULL;
|
|||||||
static unsigned zopt_objects = 0;
|
static unsigned zopt_objects = 0;
|
||||||
static libzfs_handle_t *g_zfs;
|
static libzfs_handle_t *g_zfs;
|
||||||
static uint64_t max_inflight = 1000;
|
static uint64_t max_inflight = 1000;
|
||||||
|
static int leaked_objects = 0;
|
||||||
|
|
||||||
static void snprintf_blkptr_compact(char *, size_t, const blkptr_t *);
|
static void snprintf_blkptr_compact(char *, size_t, const blkptr_t *);
|
||||||
|
|
||||||
@ -1988,9 +1989,12 @@ dump_znode(objset_t *os, uint64_t object, void *data, size_t size)
|
|||||||
|
|
||||||
if (dump_opt['d'] > 4) {
|
if (dump_opt['d'] > 4) {
|
||||||
error = zfs_obj_to_path(os, object, path, sizeof (path));
|
error = zfs_obj_to_path(os, object, path, sizeof (path));
|
||||||
if (error != 0) {
|
if (error == ESTALE) {
|
||||||
|
(void) snprintf(path, sizeof (path), "on delete queue");
|
||||||
|
} else if (error != 0) {
|
||||||
|
leaked_objects++;
|
||||||
(void) snprintf(path, sizeof (path),
|
(void) snprintf(path, sizeof (path),
|
||||||
"\?\?\?<object#%llu>", (u_longlong_t)object);
|
"path not found, possibly leaked");
|
||||||
}
|
}
|
||||||
(void) printf("\tpath %s\n", path);
|
(void) printf("\tpath %s\n", path);
|
||||||
}
|
}
|
||||||
@ -2320,6 +2324,12 @@ dump_dir(objset_t *os)
|
|||||||
}
|
}
|
||||||
|
|
||||||
ASSERT3U(object_count, ==, usedobjs);
|
ASSERT3U(object_count, ==, usedobjs);
|
||||||
|
|
||||||
|
if (leaked_objects != 0) {
|
||||||
|
(void) printf("%d potentially leaked objects detected\n",
|
||||||
|
leaked_objects);
|
||||||
|
leaked_objects = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -5405,5 +5415,5 @@ main(int argc, char **argv)
|
|||||||
libzfs_fini(g_zfs);
|
libzfs_fini(g_zfs);
|
||||||
kernel_fini();
|
kernel_fini();
|
||||||
|
|
||||||
return (0);
|
return (error);
|
||||||
}
|
}
|
||||||
|
@ -22,7 +22,7 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
|
||||||
* Copyright 2015 Nexenta Systems, Inc. All rights reserved.
|
* Copyright 2015 Nexenta Systems, Inc. All rights reserved.
|
||||||
* Copyright (c) 2015 by Delphix. All rights reserved.
|
* Copyright (c) 2015, 2017 by Delphix. All rights reserved.
|
||||||
* Copyright 2016 Joyent, Inc.
|
* Copyright 2016 Joyent, Inc.
|
||||||
* Copyright 2016 Igor Kozhukhov <ikozhukhov@gmail.com>
|
* Copyright 2016 Igor Kozhukhov <ikozhukhov@gmail.com>
|
||||||
*/
|
*/
|
||||||
@ -101,7 +101,10 @@ get_stats_for_obj(differ_info_t *di, const char *dsname, uint64_t obj,
|
|||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (di->zerr == EPERM) {
|
if (di->zerr == ESTALE) {
|
||||||
|
(void) snprintf(pn, maxlen, "(on_delete_queue)");
|
||||||
|
return (0);
|
||||||
|
} else if (di->zerr == EPERM) {
|
||||||
(void) snprintf(di->errbuf, sizeof (di->errbuf),
|
(void) snprintf(di->errbuf, sizeof (di->errbuf),
|
||||||
dgettext(TEXT_DOMAIN,
|
dgettext(TEXT_DOMAIN,
|
||||||
"The sys_config privilege or diff delegated permission "
|
"The sys_config privilege or diff delegated permission "
|
||||||
|
@ -2102,6 +2102,17 @@ zfs_obj_to_path_impl(objset_t *osp, uint64_t obj, sa_handle_t *hdl,
|
|||||||
*path = '\0';
|
*path = '\0';
|
||||||
sa_hdl = hdl;
|
sa_hdl = hdl;
|
||||||
|
|
||||||
|
uint64_t deleteq_obj;
|
||||||
|
VERIFY0(zap_lookup(osp, MASTER_NODE_OBJ,
|
||||||
|
ZFS_UNLINKED_SET, sizeof (uint64_t), 1, &deleteq_obj));
|
||||||
|
error = zap_lookup_int(osp, deleteq_obj, obj);
|
||||||
|
if (error == 0) {
|
||||||
|
return (ESTALE);
|
||||||
|
} else if (error != ENOENT) {
|
||||||
|
return (error);
|
||||||
|
}
|
||||||
|
error = 0;
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
uint64_t pobj;
|
uint64_t pobj;
|
||||||
char component[MAXNAMELEN + 2];
|
char component[MAXNAMELEN + 2];
|
||||||
|
Loading…
x
Reference in New Issue
Block a user