[Gluster-devel] Glusterfs and the new logging framework

Raghavendra Gowdappa rgowdapp at redhat.com
Mon Apr 28 06:09:50 UTC 2014


(Moving the discussion to gluster-devel).

----- Original Message -----
> From: "Nagaprasad Sathyanarayana" <nsathyan at redhat.com>
> To: "Nithya Balachandran" <nbalacha at redhat.com>
> Cc: "Raghavendra Gowdappa" <rgowdapp at redhat.com>, "Susant Palai" <spalai at redhat.com>, "Atin Mukherjee"
> <amukherj at redhat.com>, "Varun Shastry" <vshastry at redhat.com>, "Krishnan Parthasarathi" <kparthas at redhat.com>,
> "Ravishankar Narayanankutty" <ranaraya at redhat.com>, "Pranith Kumar Karampuri" <pkarampu at redhat.com>, "Venkatesh
> Somyajulu" <vsomyaju at redhat.com>
> Sent: Monday, April 28, 2014 10:53:55 AM
> Subject: Re: Glusterfs and the new logging framework
> 
> It is a very valuable suggestion Nithya.  Using descriptive message IDs
> (DHT_GET_CACHED_SUBVOL_FAILED in place of dht_msg_1) is definitely helpful
> to developers and improves the code readability.  However, IMO, keeping the
> actual formatted message string in a header file is a good practice.  Some
> of the reasons for it are;
> 
> A> It helps in internationalization and localization at later point.
> B> Any changes to the message & the formatting is easy to handle when it is
> not embedded in the log function call.
> 
> Please discuss this with wider audience, including Vijay & Alok, before
> finalizing the approach.
> 
> Thanks
> Naga
> 
> ----- Original Message -----
> From: "Nithya Balachandran" <nbalacha at redhat.com>
> To: "Raghavendra Gowdappa" <rgowdapp at redhat.com>, "Susant Palai"
> <spalai at redhat.com>, "Atin Mukherjee" <amukherj at redhat.com>, "Varun Shastry"
> <vshastry at redhat.com>, "Krishnan Parthasarathi" <kparthas at redhat.com>,
> "Ravishankar Narayanankutty" <ranaraya at redhat.com>, "Pranith Kumar
> Karampuri" <pkarampu at redhat.com>, "Venkatesh Somyajulu"
> <vsomyaju at redhat.com>
> Cc: "Nagaprasad Sathyanarayana" <nsathyan at redhat.com>
> Sent: Monday, April 28, 2014 9:16:37 AM
> Subject: Glusterfs and the new logging framework
> 
> Hi,
> 
> I am currently working on porting the DHT messages to the new logging
> framework and I have some observations/concerns about the approach on the
> same:
> 
> 1. With the current approach, a call to gf_msg would look like:
> 
> gf_msg ("dht", GF_LOG_ERROR, 0, dht_msg_1, param1);
> 
> This provides little information to the developer when going through the
> code. It becomes tedious to lookup the value of dht_msg_4 each time. This
> also reduces code readability as the format string is not available
> instantly and can potentially cause issues with incorrect parameters being
> passed to the call.
> 
> 
> 2. Adding new messages can potentially cause us to use up the chunk of
> message ids quickly. A better approach would be to decouple the is
> definition from the actual message string.There are be several potential
> messages for a single operation state.Message formats might change in the
> future as we add enhancements - for eg, we shouldn't have to add new
> messages with new message ids to accommodate an additional parameter if we
> change a struct definition, say. Defining some sort of "state ids" however
> will take up fewer ids.
> 
> Eg: The code has the following messages :
> 
> "Failed to get cached subvol for %s"
> "Failed to get cached subvol for %s on %s"
> 
> 
> Both the above will require separate msg-ids with the current approach. The
> difference in the strings is minimal and does not really provide any
> additional information from the Doxygen doc point of view.
> 
> Another approach would be to define a DHT_GET_CACHED_SUBVOL_FAILED id which
> can be passed to the msglog, while the actual message string can change
> depending on what the developer thinks will be helpful. This will also
> improve code readability.
> 
> So I propose that we do the following:
> 
> 
> Current approach:
> 
> Messages file:
> 
> #define dht_msg_1 (GLFS_COM_BASE + 1) , "Failed to get cached subvol for %s"
> #define dht_msg_2 (GLFS_COM_BASE + 2) , "Failed to get cached subvol for %s
> on %s"
> #define dht_msg_3 (GLFS_COM_BASE + 3) , "Failed to get hashed subvol " ...etc
> etc
> 
> Code :
> gf_msg ("dht", GF_LOG_ERROR, 0, dht_msg_1, param1);
> 
> gf_msg ("dht", GF_LOG_ERROR, 0, dht_msg_2, param1, param2);
> 
> The above is confusing for a developer.
> 
> 
> Proposed approach:
> 
> #define DHT_GET_CACHED_SUBVOL_FAILED (GLFS_COM_BASE + 1)
> #define DHT_GET_HASHED_SUBVOL_FAILED (GLFS_COM_BASE + 2)
> 
> gf_msg ("dht", GF_LOG_ERROR, 0, DHT_GET_CACHED_SUBVOL_FAILED, "Failed to get
> cached subvol for %s on %s" , param1, param2);
> 
> gf_msg ("dht", GF_LOG_ERROR, 0, DHT_GET_CACHED_SUBVOL_FAILED, "Failed to get
> cached subvol for %s " , param1);
> 
> 
> Advantages:
> Much clearer code - developer can use generated id or define new one easily.
> Related ids can be grouped together in the header file.
> Fewer ids required
> No changes to the logging framework
> Messages can change later
> The approach of using and id and generating a doxygen doc for the same still
> holds good - we are simply decoupling the actual string from the definition.
> So the doc would still have the message id and a description of the
> condition it specifies without tying it to a string that might change later.
> 
> 
> Thoughts?
> 
> Regards,
> Nithya
> 
> 
> 
> 
> 



More information about the Gluster-devel mailing list