[lvm-devel] master - report: add CMDLOG report type
Peter Rajnoha
prajnoha at fedoraproject.org
Mon Jun 20 09:40:19 UTC 2016
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=99c2a2b960d24d4826e3e66b4879de4bad13fbab
Commit: 99c2a2b960d24d4826e3e66b4879de4bad13fbab
Parent: 094fce37765964a9c3b32d1473e75c7d121eace1
Author: Peter Rajnoha <prajnoha at redhat.com>
AuthorDate: Tue May 10 15:15:48 2016 +0200
Committer: Peter Rajnoha <prajnoha at redhat.com>
CommitterDate: Mon Jun 20 11:33:08 2016 +0200
report: add CMDLOG report type
This is a preparation for new CMDLOG report type which is going to be
used for reporting LVM command log.
The new report type introduces several new fields (log_seq_num, log_type,
log_context, log_object_type, log_object_group, log_object_id, object_name,
log_message, log_errno, log_ret_code) as well as new configuration settings
to set this report type (report/command_log_sort and report/command_log_cols
lvm.conf settings).
This patch also introduces internal report_cmdlog helper function
which is a wrapper over dm_report_object to report command log via
CMDLOG report type and which is going to be used throughout the code
to report the log items.
---
WHATS_NEW | 3 ++
lib/config/defaults.h | 2 +
lib/report/columns-cmdlog.h | 40 ++++++++++++++++++++++++++++++++++
lib/report/report.c | 50 ++++++++++++++++++++++++++++++++++++++++--
lib/report/report.h | 40 +++++++++++++++++++++++++--------
tools/reporter.c | 7 ++++++
6 files changed, 129 insertions(+), 13 deletions(-)
diff --git a/WHATS_NEW b/WHATS_NEW
index c91e28d..2c360cb 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,8 @@
Version 2.02.158 -
=================================
+ Add log_object_{type,name,id,group,group_id} fields to cmd log.
+ Add log_{seq_num,type,context,message,errno,ret_code} fields to cmd log.
+ Add CMDLOG report type - a separate report type for command logging.
Version 2.02.157 - 17th June 2016
=================================
diff --git a/lib/config/defaults.h b/lib/config/defaults.h
index 07ca5de..82e3716 100644
--- a/lib/config/defaults.h
+++ b/lib/config/defaults.h
@@ -215,6 +215,7 @@
#define DEFAULT_SEGS_COLS "lv_name,vg_name,lv_attr,stripes,segtype,seg_size"
#define DEFAULT_PVSEGS_COLS "pv_name,vg_name,pv_fmt,pv_attr,pv_size,pv_free,pvseg_start,pvseg_size"
#define DEFAULT_DEVTYPES_COLS "devtype_name,devtype_max_partitions,devtype_description"
+#define DEFAULT_COMMAND_LOG_COLS "log_seq_num,log_type,log_context,log_object_type,log_object_name,log_object_id,log_object_group,log_object_group_id,log_message,log_errno,log_ret_code"
#define DEFAULT_LVS_COLS_VERB "lv_name,vg_name,seg_count,lv_attr,lv_size,lv_major,lv_minor,lv_kernel_major,lv_kernel_minor,pool_lv,origin,data_percent,metadata_percent,move_pv,copy_percent,mirror_log,convert_lv,lv_uuid,lv_profile"
#define DEFAULT_VGS_COLS_VERB "vg_name,vg_attr,vg_extent_size,pv_count,lv_count,snap_count,vg_size,vg_free,vg_uuid,vg_profile"
@@ -229,6 +230,7 @@
#define DEFAULT_SEGS_SORT "vg_name,lv_name,seg_start"
#define DEFAULT_PVSEGS_SORT "pv_name,pvseg_start"
#define DEFAULT_DEVTYPES_SORT "devtype_name"
+#define DEFAULT_COMMAND_LOG_SORT "log_seq_num"
#define DEFAULT_MIRROR_DEVICE_FAULT_POLICY "remove"
#define DEFAULT_MIRROR_LOG_FAULT_POLICY "allocate"
diff --git a/lib/report/columns-cmdlog.h b/lib/report/columns-cmdlog.h
new file mode 100644
index 0000000..3dd7df5
--- /dev/null
+++ b/lib/report/columns-cmdlog.h
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2016 Red Hat, Inc. All rights reserved.
+ *
+ * This file is part of LVM2.
+ *
+ * This copyrighted material is made available to anyone wishing to use,
+ * modify, copy, or redistribute it subject to the terms and conditions
+ * of the GNU Lesser General Public License v.2.1.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+/*
+ * This file defines the fields (columns) for the command log reporting.
+ *
+ * The preferred order of the field descriptions in the help text
+ * determines the order the entries appear in this file.
+ *
+ * When adding new entries take care to use the existing style.
+ * Displayed fields names normally have a type prefix and use underscores.
+ * Field-specific internal functions names normally match the displayed
+ * field names but without underscores.
+ * Help text ends with a full stop.
+ */
+
+/* *INDENT-OFF* */
+FIELD(CMDLOG, cmd_log_item, NUM, "Seq", seq_num, 3, uint32, log_seq_num, "Log sequence number.", 0)
+FIELD(CMDLOG, cmd_log_item, STR, "LogType", type, 7, string, log_type, "Log type.", 0)
+FIELD(CMDLOG, cmd_log_item, STR, "Context", context, 7, string, log_context, "Current context.", 0)
+FIELD(CMDLOG, cmd_log_item, STR, "ObjType", object_type_name, 7, string, log_object_type, "Current object type.", 0)
+FIELD(CMDLOG, cmd_log_item, STR, "ObjName", object_name, 7, string, log_object_name, "Current object name.", 0)
+FIELD(CMDLOG, cmd_log_item, STR, "ObjID", object_id, 7, string, log_object_id, "Current object ID.", 0)
+FIELD(CMDLOG, cmd_log_item, STR, "ObjGrp", object_group, 7, string, log_object_group, "Current object group.", 0)
+FIELD(CMDLOG, cmd_log_item, STR, "ObjGrpID", object_group_id, 8, string, log_object_group_id, "Current object group ID.", 0)
+FIELD(CMDLOG, cmd_log_item, STR, "Msg", msg, 7, string, log_message, "Log message.", 0)
+FIELD(CMDLOG, cmd_log_item, SNUM, "Errno", current_errno, 5, int32, log_errno, "Errno.", 0)
+FIELD(CMDLOG, cmd_log_item, SNUM, "RetCode", ret_code, 7, int32, log_ret_code, "Return code.", 0)
+/* *INDENT-ON* */
diff --git a/lib/report/report.c b/lib/report/report.c
index 8e08c75..eec9756 100644
--- a/lib/report/report.c
+++ b/lib/report/report.c
@@ -3622,6 +3622,16 @@ static void *_obj_get_devtypes(void *obj)
return obj;
}
+static void *_obj_get_cmdlog(void *obj)
+{
+ return obj;
+}
+
+static const struct dm_report_object_type _log_report_types[] = {
+ { CMDLOG, "Command Log", "log_", _obj_get_cmdlog },
+ { 0, "", "", NULL },
+};
+
static const struct dm_report_object_type _report_types[] = {
{ VGS, "Volume Group", "vg_", _obj_get_vg },
{ LVS, "Logical Volume", "lv_", _obj_get_lv },
@@ -3656,6 +3666,8 @@ static const struct dm_report_object_type _devtypes_report_types[] = {
{type, sorttype, offsetof(type_ ## strct, field), width ? : sizeof(head) - 1, \
#id, head, &_ ## func ## _disp, desc},
+typedef struct cmd_log_item type_cmd_log_item;
+
typedef struct physical_volume type_pv;
typedef struct logical_volume type_lv;
typedef struct volume_group type_vg;
@@ -3675,6 +3687,11 @@ static const struct dm_report_field_type _devtypes_fields[] = {
{0, 0, 0, 0, "", "", NULL, NULL},
};
+static const struct dm_report_field_type _log_fields[] = {
+#include "columns-cmdlog.h"
+{0, 0, 0, 0, "", "", NULL, NULL},
+};
+
#undef STR
#undef NUM
#undef BIN
@@ -3712,7 +3729,11 @@ void *report_init(struct cmd_context *cmd, const char *format, const char *keys,
if (columns_as_rows)
report_flags |= DM_REPORT_OUTPUT_COLUMNS_AS_ROWS;
- if (*report_type & DEVTYPES) {
+ if (*report_type & CMDLOG) {
+ types = _log_report_types;
+ fields = _log_fields;
+ reserved_values = NULL;
+ } else if (*report_type & DEVTYPES) {
types = _devtypes_report_types;
fields = _devtypes_fields;
reserved_values = NULL;
@@ -3748,8 +3769,12 @@ const char *report_get_field_prefix(report_type_t report_type_id)
{
const struct dm_report_object_type *report_types, *report_type;
- report_types = report_type_id & DEVTYPES ? _devtypes_report_types
- : _report_types;
+ if (report_type_id & CMDLOG)
+ report_types = _log_report_types;
+ else if (report_type_id & DEVTYPES)
+ report_types = _devtypes_report_types;
+ else
+ report_types = _report_types;
for (report_type = report_types; report_type->id; report_type++) {
if (report_type_id & report_type->id)
@@ -3825,3 +3850,22 @@ int report_devtypes(void *handle)
return 1;
}
+
+int report_cmdlog(void *handle, const char *type, const char *context,
+ const char *object_type_name, const char *object_name,
+ const char *object_id, const char *object_group,
+ const char *object_group_id, const char *msg,
+ int current_errno, int ret_code)
+{
+ static uint32_t seq_num = 1;
+
+ struct cmd_log_item log_item = {seq_num++, type, context, object_type_name,
+ object_name ? : "", object_id ? : "",
+ object_group ? : "", object_group_id ? : "",
+ msg ? : "", current_errno, ret_code};
+
+ if (handle)
+ return dm_report_object(handle, &log_item);
+
+ return 1;
+}
diff --git a/lib/report/report.h b/lib/report/report.h
index 8db84e0..06ffe70 100644
--- a/lib/report/report.h
+++ b/lib/report/report.h
@@ -21,16 +21,17 @@
#include "activate.h"
typedef enum {
- LVS = 1,
- LVSINFO = 2,
- LVSSTATUS = 4,
- LVSINFOSTATUS = 8,
- PVS = 16,
- VGS = 32,
- SEGS = 64,
- PVSEGS = 128,
- LABEL = 256,
- DEVTYPES = 512
+ CMDLOG = 1,
+ LVS = 2,
+ LVSINFO = 4,
+ LVSSTATUS = 8,
+ LVSINFOSTATUS = 16,
+ PVS = 32,
+ VGS = 64,
+ SEGS = 128,
+ PVSEGS = 256,
+ LABEL = 512,
+ DEVTYPES = 1024
} report_type_t;
/*
@@ -58,6 +59,20 @@ struct selection_handle {
int selected;
};
+struct cmd_log_item {
+ uint32_t seq_num;
+ const char *type;
+ const char *context;
+ const char *object_type_name;
+ const char *object_name;
+ const char *object_id;
+ const char *object_group;
+ const char *object_group_id;
+ const char *msg;
+ int current_errno;
+ int ret_code;
+};
+
struct field;
struct report_handle;
struct processing_handle;
@@ -84,6 +99,11 @@ int report_object(void *handle, int selection_only, const struct volume_group *v
const struct lv_with_info_and_seg_status *lvdm,
const struct label *label);
int report_devtypes(void *handle);
+int report_cmdlog(void *handle, const char *type, const char *context,
+ const char *object_type_name, const char *object_name,
+ const char *object_id, const char *object_group,
+ const char *object_group_id, const char *msg,
+ int current_errno, int ret_code);
int report_output(void *handle);
#endif
diff --git a/tools/reporter.c b/tools/reporter.c
index f572d31..6ba1b5b 100644
--- a/tools/reporter.c
+++ b/tools/reporter.c
@@ -877,6 +877,9 @@ static int _do_report(struct cmd_context *cmd, struct report_args *args)
r = process_each_vg(cmd, args->argc, args->argv, NULL, NULL,
0, handle, &_pvsegs_in_vg);
break;
+ case CMDLOG:
+ /* Log is reported throughout the code via report_cmdlog calls. */
+ break;
default:
log_error(INTERNAL_ERROR "_do_report: unknown report type.");
return 0;
@@ -959,6 +962,10 @@ static int _config_report(struct cmd_context *cmd, struct report_args *args)
else
args->options = find_config_tree_str(cmd, report_pvsegs_cols_verbose_CFG, NULL);
break;
+ case CMDLOG:
+ args->keys = DEFAULT_COMMAND_LOG_SORT;
+ args->options = DEFAULT_COMMAND_LOG_COLS;
+ break;
default:
log_error(INTERNAL_ERROR "_report: unknown report type.");
return 0;
More information about the lvm-devel
mailing list