public inbox for lvm2-cvs@sourceware.org
help / color / mirror / Atom feed
From: agk@sourceware.org
To: lvm-devel@redhat.com, lvm2-cvs@sourceware.org
Subject: LVM2 daemons/lvmetad/lvmetad-core.c lib/cache/ ...
Date: Fri, 02 Mar 2012 20:46:00 -0000	[thread overview]
Message-ID: <20120302204639.19383.qmail@sourceware.org> (raw)

CVSROOT:	/cvs/lvm2
Module name:	LVM2
Changes by:	agk@sourceware.org	2012-03-02 20:46:37

Modified files:
	daemons/lvmetad: lvmetad-core.c 
	lib/cache      : lvmetad.c lvmetad.h 
	lib/format_text: format-text.c 
	lib/metadata   : metadata.c 

Log message:
	Pass struct device around internally rather than dev_t.
	Add 3rd daemon return state "unknown" for lookups that are carried out
	successfully but don't find the item requested.
	Avoid issuing error messages when it's expected that a device that's
	being looked up in lvmetad might not be there.

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/daemons/lvmetad/lvmetad-core.c.diff?cvsroot=lvm2&r1=1.46&r2=1.47
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/cache/lvmetad.c.diff?cvsroot=lvm2&r1=1.14&r2=1.15
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/cache/lvmetad.h.diff?cvsroot=lvm2&r1=1.4&r2=1.5
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/format_text/format-text.c.diff?cvsroot=lvm2&r1=1.198&r2=1.199
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/metadata/metadata.c.diff?cvsroot=lvm2&r1=1.496&r2=1.497

--- LVM2/daemons/lvmetad/lvmetad-core.c	2012/03/01 22:52:59	1.46
+++ LVM2/daemons/lvmetad/lvmetad-core.c	2012/03/02 20:46:36	1.47
@@ -47,6 +47,7 @@
 	fprintf(stderr, "[D %lu] ", pthread_self());
 	vfprintf(stderr, fmt, ap);
 	va_end(ap);
+	fflush(stderr);
 }
 
 static int debug_cft_line(const char *line, void *baton) {
@@ -412,14 +413,14 @@
 		debug("pv_lookup: could not find device %" PRIu64 "\n", devt);
 		unlock_pvid_to_pvmeta(s);
 		dm_config_destroy(res.cft);
-		return daemon_reply_simple("failed", "reason = %s", "device not found", NULL);
+		return daemon_reply_simple("unknown", "reason = %s", "device not found", NULL);
 	}
 
 	pv = make_pv_node(s, pvid, res.cft, NULL, res.cft->root);
 	if (!pv) {
 		unlock_pvid_to_pvmeta(s);
 		dm_config_destroy(res.cft);
-		return daemon_reply_simple("failed", "reason = %s", "PV not found", NULL);
+		return daemon_reply_simple("unknown", "reason = %s", "PV not found", NULL);
 	}
 
 	pv->key = "physical_volume";
@@ -520,12 +521,12 @@
 	debug("vg_lookup: updated uuid = %s, name = %s\n", uuid, name);
 
 	if (!uuid)
-		return daemon_reply_simple("failed", "reason = %s", "VG not found", NULL);
+		return daemon_reply_simple("unknown", "reason = %s", "VG not found", NULL);
 
 	cft = lock_vg(s, uuid);
 	if (!cft || !cft->root) {
 		unlock_vg(s, uuid);
-		return daemon_reply_simple("failed", "reason = %s", "UUID not found", NULL);
+		return daemon_reply_simple("unknown", "reason = %s", "UUID not found", NULL);
 	}
 
 	metadata = cft->root;
@@ -821,7 +822,7 @@
 		pvid = dm_hash_lookup_binary(s->device_to_pvid, &device, sizeof(device));
 	if (!pvid) {
 		unlock_pvid_to_pvmeta(s);
-		return daemon_reply_simple("failed", "reason = %s", "device not in cache", NULL);
+		return daemon_reply_simple("unknown", "reason = %s", "device not in cache", NULL);
 	}
 
 	debug("pv_gone (updated): %s / %" PRIu64 "\n", pvid, device);
@@ -836,7 +837,7 @@
 		dm_config_destroy(pvmeta);
 		return daemon_reply_simple("OK", NULL);
 	} else
-		return daemon_reply_simple("failed", "reason = %s", "PVID does not exist", NULL);
+		return daemon_reply_simple("unknown", "reason = %s", "PVID does not exist", NULL);
 }
 
 static response pv_found(lvmetad_state *s, request r)
@@ -912,6 +913,7 @@
 		else {
 			unlock_vg(s, vgid);
 			return daemon_reply_simple("failed", "reason = %s",
+// FIXME provide meaningful-to-user error message
 						   "internal treason!", NULL);
 		}
 		unlock_vg(s, vgid);
--- LVM2/lib/cache/lvmetad.c	2012/03/02 18:09:46	1.14
+++ LVM2/lib/cache/lvmetad.c	2012/03/02 20:46:37	1.15
@@ -31,7 +31,7 @@
 	if (_using_lvmetad) { /* configured by the toolcontext */
 		_lvmetad = lvmetad_open(socket ?: DEFAULT_RUN_DIR "/lvmetad.socket");
 		if (_lvmetad.socket_fd < 0 || _lvmetad.error) {
-			log_warn("WARNING: Failed to connect to lvmetad: %s. Falling back to scanning.", strerror(_lvmetad.error));
+			log_warn("WARNING: Failed to connect to lvmetad: %s. Falling back to internal scanning.", strerror(_lvmetad.error));
 			_using_lvmetad = 0;
 		}
 	}
@@ -39,20 +39,41 @@
 
 /*
  * Helper; evaluate the reply from lvmetad, check for errors, print diagnostics
- * and return a summary success/failure exit code. Frees up the reply resources
- * as well.
+ * and return a summary success/failure exit code.
+ *
+ * If found is set, *found indicates whether or not device exists,
+ * and missing device is not treated as an error.
  */
-static int _lvmetad_handle_reply(daemon_reply reply, const char *action, const char *object) {
-	if (reply.error || strcmp(daemon_reply_str(reply, "response", ""), "OK")) {
-		log_error("Request to %s %s in lvmetad has failed. Reason: %s",
-			  action, object, reply.error ? strerror(reply.error) :
-			  daemon_reply_str(reply, "reason", "Unknown."));
-		daemon_reply_destroy(reply);
+static int _lvmetad_handle_reply(daemon_reply reply, const char *action, const char *object,
+				 int *found)
+{
+	if (reply.error) {
+		log_error("Request to %s %s%sin lvmetad gave response %s.",
+			  action, object, *object ? " " : "", strerror(reply.error));
 		return 0;
 	}
 
-	daemon_reply_destroy(reply);
-	return 1;
+	/* All OK? */
+	if (!strcmp(daemon_reply_str(reply, "response", ""), "OK")) {
+		if (found)
+			*found = 1;
+		return 1;
+	}
+
+	/* Unknown device permitted? */
+	if (found && !strcmp(daemon_reply_str(reply, "response", ""), "unknown")) {
+		log_very_verbose("Request to %s %s%sin lvmetad did not find object.",
+				 action, object, *object ? " " : "");
+		*found = 0;
+		return 1;
+	}
+
+	log_error("Request to %s %s%sin lvmetad gave response %s. Reason: %s",
+		  action, object, *object ? " " : "", 
+		  daemon_reply_str(reply, "response", "<missing>"),
+		  daemon_reply_str(reply, "reason", "<missing>"));
+
+	return 0;
 }
 
 static int _read_mda(struct lvmcache_info *info,
@@ -268,8 +289,10 @@
 				   NULL);
 	dm_free(buf);
 
-	if (!_lvmetad_handle_reply(reply, "update VG", vg->name))
+	if (!_lvmetad_handle_reply(reply, "update VG", vg->name, NULL)) {
+		daemon_reply_destroy(reply);
 		return 0;
+	}
 
 	n = (vg->fid && vg->fid->metadata_areas_index) ?
 		dm_hash_get_first(vg->fid->metadata_areas_index) : NULL;
@@ -304,6 +327,7 @@
 {
 	char uuid[64];
 	daemon_reply reply;
+	int result;
 
 	if (!_using_lvmetad)
 		return 1; /* just fake it */
@@ -313,14 +337,18 @@
 
 	reply = daemon_send_simple(_lvmetad, "vg_remove", "uuid = %s", uuid, NULL);
 
-	return _lvmetad_handle_reply(reply, "remove VG", vg->name);
+	result = _lvmetad_handle_reply(reply, "remove VG", vg->name, NULL);
+
+	daemon_reply_destroy(reply);
+
+	return result;
 }
 
-int lvmetad_pv_lookup(struct cmd_context *cmd, struct id pvid)
+int lvmetad_pv_lookup(struct cmd_context *cmd, struct id pvid, int *found)
 {
 	char uuid[64];
 	daemon_reply reply;
-	int result = 1;
+	int result = 0;
 	struct dm_config_node *cn;
 
 	if (!_using_lvmetad)
@@ -331,40 +359,51 @@
 
 	reply = daemon_send_simple(_lvmetad, "pv_lookup", "uuid = %s", uuid, NULL);
 
-	if (reply.error || strcmp(daemon_reply_str(reply, "response", ""), "OK")) {
-		_lvmetad_handle_reply(reply, "lookup PVs", "");
-		return_0;
-	}
+	if (!_lvmetad_handle_reply(reply, "lookup PV", "", found))
+		goto_out;
+
+	if (found && !*found)
+		goto out_success;
 
 	if (!(cn = dm_config_find_node(reply.cft->root, "physical_volume")))
-		result = 0;
+		goto_out;
         else if (!_pv_populate_lvmcache(cmd, cn, 0))
-		result = 0;
+		goto_out;
 
+out_success:
+	result = 1;
+
+out:
 	daemon_reply_destroy(reply);
+
 	return result;
 }
 
-int lvmetad_pv_lookup_by_devt(struct cmd_context *cmd, dev_t device)
+int lvmetad_pv_lookup_by_dev(struct cmd_context *cmd, struct device *dev, int *found)
 {
-	int result = 1;
+	int result = 0;
 	daemon_reply reply;
 	struct dm_config_node *cn;
 
 	if (!_using_lvmetad)
 		return_0;
 
-	reply = daemon_send_simple(_lvmetad, "pv_lookup", "device = %d", device, NULL);
+	reply = daemon_send_simple(_lvmetad, "pv_lookup", "device = %d", dev->dev, NULL);
 
-	if (reply.error || strcmp(daemon_reply_str(reply, "response", ""), "OK")) {
-		_lvmetad_handle_reply(reply, "lookup PVs", "");
-		return_0;
-	}
+	if (!_lvmetad_handle_reply(reply, "lookup PV", dev_name(dev), found))
+		goto_out;
+
+	if (found && !*found)
+		goto out_success;
 
 	cn = dm_config_find_node(reply.cft->root, "physical_volume");
-	if (!cn || !_pv_populate_lvmcache(cmd, cn, device))
-		result = 0;
+	if (!cn || !_pv_populate_lvmcache(cmd, cn, dev->dev))
+		goto_out;
 
+out_success:
+	result = 1;
+
+out:
 	daemon_reply_destroy(reply);
 	return result;
 }
@@ -379,8 +418,8 @@
 
 	reply = daemon_send_simple(_lvmetad, "pv_list", NULL);
 
-	if (reply.error || strcmp(daemon_reply_str(reply, "response", ""), "OK")) {
-		_lvmetad_handle_reply(reply, "list PVs", "");
+	if (!_lvmetad_handle_reply(reply, "list PVs", "", NULL)) {
+		daemon_reply_destroy(reply);
 		return_0;
 	}
 
@@ -389,6 +428,7 @@
 			_pv_populate_lvmcache(cmd, cn, 0);
 
 	daemon_reply_destroy(reply);
+
 	return 1;
 }
 
@@ -404,8 +444,9 @@
 		return 1;
 
 	reply = daemon_send_simple(_lvmetad, "vg_list", NULL);
-	if (reply.error || strcmp(daemon_reply_str(reply, "response", ""), "OK")) {
-		_lvmetad_handle_reply(reply, "list VGs", "");
+
+	if (!_lvmetad_handle_reply(reply, "list VGs", "", NULL)) {
+		daemon_reply_destroy(reply);
 		return_0;
 	}
 
@@ -497,6 +538,7 @@
 	const char *mdas = NULL;
 	char *pvmeta;
 	char *buf = NULL;
+	int result;
 
 	if (!_using_lvmetad)
 		return 1;
@@ -553,18 +595,29 @@
 	}
 
 	dm_free(pvmeta);
-	return _lvmetad_handle_reply(reply, "update PV", uuid);
+
+	result = _lvmetad_handle_reply(reply, "update PV", uuid, NULL);
+	daemon_reply_destroy(reply);
+
+	return result;
 }
 
 static int _lvmetad_pv_gone(dev_t device, const char *pv_name)
 {
+	int result;
+	int found;
+
 	if (!_using_lvmetad)
 		return 1;
 
-	daemon_reply reply =
-		daemon_send_simple(_lvmetad, "pv_gone", "device = %d", device, NULL);
+	daemon_reply reply = daemon_send_simple(_lvmetad, "pv_gone", "device = %d", device, NULL);
+
+	result = _lvmetad_handle_reply(reply, "drop PV", pv_name, &found);
+	/* We don't care whether or not the daemon had the PV cached. */
 
-	return _lvmetad_handle_reply(reply, "drop PV", pv_name);
+	daemon_reply_destroy(reply);
+
+	return result;
 }
 
 int lvmetad_pv_gone(struct device *dev)
--- LVM2/lib/cache/lvmetad.h	2012/03/02 16:58:41	1.4
+++ LVM2/lib/cache/lvmetad.h	2012/03/02 20:46:37	1.5
@@ -79,8 +79,13 @@
  */
 int lvmetad_pv_list_to_lvmcache(struct cmd_context *cmd);
 
-int lvmetad_pv_lookup(struct cmd_context *cmd, struct id pvid);
-int lvmetad_pv_lookup_by_devt(struct cmd_context *cmd, dev_t dev);
+/*
+ * Lookup an individual PV.
+ * If found is not NULL, it is set according to whether or not the PV is found,
+ * otherwise if the PV is not found an error is returned.
+ */
+int lvmetad_pv_lookup(struct cmd_context *cmd, struct id pvid, int *found);
+int lvmetad_pv_lookup_by_dev(struct cmd_context *cmd, struct device *dev, int *found);
 
 /*
  * Request a list of all VGs available to lvmetad and use it to fill in
@@ -111,8 +116,8 @@
 #    define lvmetad_pv_found(pvid, device, fmt, label_sector, vg)	(1)
 #    define lvmetad_pv_gone(dev)	(1)
 #    define lvmetad_pv_list_to_lvmcache(cmd)	(1)
-#    define lvmetad_pv_lookup(cmd, pvid)	(0)
-#    define lvmetad_pv_lookup_by_devt(cmd, dev)	(0)
+#    define lvmetad_pv_lookup(cmd, pvid, found)	(0)
+#    define lvmetad_pv_lookup_by_dev(cmd, dev, found)	(0)
 #    define lvmetad_vg_list_to_lvmcache(cmd)	(1)
 #    define lvmetad_vg_lookup(cmd, vgname, vgid)	(NULL)
 #    define pvscan_lvmetad(cmd, argc, argv)	(0)
--- LVM2/lib/format_text/format-text.c	2012/02/29 02:35:36	1.198
+++ LVM2/lib/format_text/format-text.c	2012/03/02 20:46:37	1.199
@@ -1445,7 +1445,7 @@
 
 	if (lvmetad_active()) {
 		info = lvmcache_info_from_pvid(dev->pvid, 0);
-		if (!info && !lvmetad_pv_lookup_by_devt(fmt->cmd, dev->dev))
+		if (!info && !lvmetad_pv_lookup_by_dev(fmt->cmd, dev, NULL))
 			return 0;
 		info = lvmcache_info_from_pvid(dev->pvid, 0);
 	} else {
--- LVM2/lib/metadata/metadata.c	2012/03/02 18:09:47	1.496
+++ LVM2/lib/metadata/metadata.c	2012/03/02 20:46:37	1.497
@@ -3614,15 +3614,23 @@
 	struct lvmcache_info *info;
 	struct device *dev;
 	const struct format_type *fmt;
+	int found;
 
 	if (!(dev = dev_cache_get(pv_name, cmd->filter)))
 		return_NULL;
 
 	if (lvmetad_active()) {
 		info = lvmcache_info_from_pvid(dev->pvid, 0);
-// FIXME AGK no error unless 'warnings' set!
-		if (!info && !lvmetad_pv_lookup_by_devt(cmd, dev->dev))
-			return NULL;
+		if (!info) {
+			if (!lvmetad_pv_lookup_by_dev(cmd, dev, &found))
+				return_NULL;
+			if (!found) {
+				if (warnings)
+					log_error("No physical volume found in lvmetad cache for %s",
+						  pv_name);
+				return NULL;
+			}
+		}
 		info = lvmcache_info_from_pvid(dev->pvid, 0);
 		label = lvmcache_get_label(info);
 	} else {


             reply	other threads:[~2012-03-02 20:46 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-03-02 20:46 agk [this message]
  -- strict thread matches above, loose matches on Subject: below --
2012-03-01 22:53 zkabelac

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20120302204639.19383.qmail@sourceware.org \
    --to=agk@sourceware.org \
    --cc=lvm-devel@redhat.com \
    --cc=lvm2-cvs@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).