Date: Mon, 14 Oct 2013 20:53:51 +0000 (UTC) From: Alan Somers <asomers@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r256452 - projects/zfsd/head/cddl/sbin/zfsd Message-ID: <201310142053.r9EKrpUf051894@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: asomers Date: Mon Oct 14 20:53:51 2013 New Revision: 256452 URL: http://svnweb.freebsd.org/changeset/base/256452 Log: Modify ParseException so that it records the parse buffer upon construction. This allows it to be caught at any level in the program and logged with full fidelity. cddl/sbin/zfsd/dev_ctl_event.cc: cddl/sbin/zfsd/dev_ctl_event.h: Update ParseException implementation: take the parse buffer string on construction and don't require the parse buffer string when logging or converting the exception to a string. cddl/sbin/zfsd/dev_ctl_event.cc: cddl/sbin/zfsd/case_file.cc: Adjust to Log() and ToString() taking no arguments. Submitted by: gibbs Approved by: ken (mentor) Sponsored By: Spectra Logic Modified: projects/zfsd/head/cddl/sbin/zfsd/case_file.cc projects/zfsd/head/cddl/sbin/zfsd/dev_ctl_event.cc projects/zfsd/head/cddl/sbin/zfsd/dev_ctl_event.h Modified: projects/zfsd/head/cddl/sbin/zfsd/case_file.cc ============================================================================== --- projects/zfsd/head/cddl/sbin/zfsd/case_file.cc Mon Oct 14 20:51:51 2013 (r256451) +++ projects/zfsd/head/cddl/sbin/zfsd/case_file.cc Mon Oct 14 20:53:51 2013 (r256452) @@ -649,7 +649,7 @@ CaseFile::DeSerializeFile(const char *fi } } catch (const ParseException &exp) { - exp.Log(evString); + exp.Log(); if (caseFile != existingCaseFile) delete caseFile; Modified: projects/zfsd/head/cddl/sbin/zfsd/dev_ctl_event.cc ============================================================================== --- projects/zfsd/head/cddl/sbin/zfsd/dev_ctl_event.cc Mon Oct 14 20:51:51 2013 (r256451) +++ projects/zfsd/head/cddl/sbin/zfsd/dev_ctl_event.cc Mon Oct 14 20:53:51 2013 (r256452) @@ -61,7 +61,7 @@ using std::stringstream; /*------------------------------ ParseException ------------------------------*/ //- ParseException Public Methods ---------------------------------------------- string -ParseException::ToString(const string &parsedBuffer) const +ParseException::ToString() const { stringstream result; @@ -82,9 +82,9 @@ ParseException::ToString(const string &p } result << "exception on buffer: \'"; if (GetOffset() == 0) { - result << parsedBuffer << '\'' << endl; + result << m_parsedBuffer << '\'' << endl; } else { - string markedBuffer(parsedBuffer); + string markedBuffer(m_parsedBuffer); markedBuffer.insert(GetOffset(), "<HERE-->"); result << markedBuffer << '\'' << endl; @@ -94,14 +94,14 @@ ParseException::ToString(const string &p } void -ParseException::Log(const string &parsedBuffer) const +ParseException::Log() const { int priority(LOG_ERR); if (Type() == DISCARDED_EVENT_TYPE) priority = LOG_INFO; - syslog(priority, "%s", ToString(parsedBuffer).c_str()); + syslog(priority, "%s", ToString().c_str()); } /*-------------------------------- DevCtlEvent -------------------------------*/ @@ -149,7 +149,7 @@ DevCtlEvent::CreateEvent(const string &e ParseEventString(type, eventString, nvpairs); } catch (const ParseException &exp) { if (exp.GetType() == ParseException::INVALID_FORMAT) - exp.Log(eventString); + exp.Log(); return (NULL); } @@ -312,14 +312,14 @@ DevCtlEvent::ParseEventString(DevCtlEven end = eventString.find_first_of(" \t\n", start); if (end == string::npos) throw ParseException(ParseException::INVALID_FORMAT, - start); + eventString, start); nvpairs["device-name"] = eventString.substr(start, end - start); start = eventString.find(" on ", end); if (end == string::npos) throw ParseException(ParseException::INVALID_FORMAT, - start); + eventString, start); start += 4; end = eventString.find_first_of(" \t\n", start); nvpairs["parent"] = eventString.substr(start, end); @@ -327,9 +327,11 @@ DevCtlEvent::ParseEventString(DevCtlEven case NOTIFY: break; case NOMATCH: - throw ParseException(ParseException::DISCARDED_EVENT_TYPE); + throw ParseException(ParseException::DISCARDED_EVENT_TYPE, + eventString); default: - throw ParseException(ParseException::UNKNOWN_EVENT_TYPE); + throw ParseException(ParseException::UNKNOWN_EVENT_TYPE, + eventString); } /* Process common "key=value" format. */ @@ -349,7 +351,7 @@ DevCtlEvent::ParseEventString(DevCtlEven start = eventString.find_last_of("! \t\n", end); if (start == string::npos) throw ParseException(ParseException::INVALID_FORMAT, - end); + eventString, end); start++; string key(eventString.substr(start, end - start)); @@ -360,7 +362,7 @@ DevCtlEvent::ParseEventString(DevCtlEven start = end + 1; if (start >= eventString.length()) throw ParseException(ParseException::INVALID_FORMAT, - end); + eventString, end); end = eventString.find_first_of(" \t\n", start); if (end == string::npos) end = eventString.length() - 1; Modified: projects/zfsd/head/cddl/sbin/zfsd/dev_ctl_event.h ============================================================================== --- projects/zfsd/head/cddl/sbin/zfsd/dev_ctl_event.h Mon Oct 14 20:51:51 2013 (r256451) +++ projects/zfsd/head/cddl/sbin/zfsd/dev_ctl_event.h Mon Oct 14 20:53:51 2013 (r256452) @@ -80,18 +80,21 @@ public: /** * Constructor * - * \param type The type of this exception. - * \param offset The location in the parse buffer where this - * exception occurred. + * \param type The type of this exception. + * \param parsedBuffer The parsing buffer active at the time of + * the exception. + * \param offset The location in the parse buffer where this + * exception occurred. */ - ParseException(Type type, size_t offset = 0); + ParseException(Type type, const string &parsedBuffer, + size_t offset = 0); /** * Accessor * * \return The classification for this exception. */ - Type GetType() const; + Type GetType() const; /** * Accessor @@ -99,37 +102,42 @@ public: * \return The offset into the event string where this exception * occurred. */ - size_t GetOffset() const; + size_t GetOffset() const; /** * Convert an exception into a human readable string. * * \param parsedBuffer The event buffer that caused the failure. */ - string ToString(const string &parsedBuffer) const; + string ToString() const; /** * Log exception data to syslog. * * \param parsedBuffer The event buffer that caused the failure. */ - void Log(const string &parsedBuffer) const; + void Log() const; private: /** The type of this exception. */ - Type m_type; + Type m_type; + + /** The parsing buffer that was active at the time of the exception. */ + const string m_parsedBuffer; /** * The offset into the event string buffer from where this * exception was triggered. */ - size_t m_offset; + size_t m_offset; }; //- ParseException Inline Public Methods --------------------------------------- inline -ParseException::ParseException(Type type, size_t offset) +ParseException::ParseException(Type type, const string &parsedBuffer, + size_t offset) : m_type(type), + m_parsedBuffer(parsedBuffer), m_offset(offset) { }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201310142053.r9EKrpUf051894>