[libvirt] [PATCH] Allow to dynamically set the size of the debug buffer
Daniel Veillard
veillard at redhat.com
Wed Mar 9 00:38:53 UTC 2011
On Tue, Mar 08, 2011 at 08:33:50AM -0700, Eric Blake wrote:
> On 03/08/2011 03:44 AM, Daniel Veillard wrote:
> > Allow to dynamically set the size of the debug buffer
> >
> > This is the part allowing to dynamically resize the debug log
> > buffer from it's default 64kB size. The buffer is now dynamically
> > allocated.
> > It adds a new API virLogSetBufferSize() which resizes the buffer
> > If passed a zero size, the buffer is deallocated and we do the small
> > optimization of not formatting messages which are not output anymore.
>
> Can you convince git to also include the diffstat of your patches?
I didn't used git to send the mail.
> > @@ -192,6 +195,15 @@ int virLogStartup(void) {
> >
> > virLogInitialized = 1;
> > virLogLock();
> > + if (VIR_ALLOC_N(virLogBuffer, virLogSize) < 0) {
> > + /*
> > + * The debug buffer is not a critical component, allow startup
> > + * even in case of failure to allocate it in case of a
> > + * configuration mistake.
> > + */
> > + virReportOOMError();
> > + virLogSize = 0;
>
> If there was a configuration mistake, such as requesting way too much
> memory, should we first try a fallback of 64k before giving up completely?
> Is virReportOOMError() the right thing to do here, if we are proceeding
> on with execution, or do we need to issue a manual VIR_WARN instead?
I'm afraid VIR_WARN just won't work, we have the virLogLock()
virReportOOMError() will fail in the same way BTW, and that's the
main problem of that patch. I will need a v2.
> > /**
> > + * virLogSetBufferSize:
> > + * @size: size of the buffer in kilobytes or 0 to deactivate
> > + *
> > + * Dynamically set the size or desactivate the logging buffer used to keep
>
> s/desactivate/deactivate/
>
> > +extern int
> > +virLogSetBufferSize(int size) {
>
> Why not s/int/size_t/, so that 64-bit systems with beefy RAM can request
> gigabytes of log? Then again, that seems like a resource hog, so int is
> probably okay.
the base unit is kilobytes per the function doc, so IMHO not needed.
> > + int ret = 0;
> > + int oldsize;
> > + char *oldLogBuffer;
> > +
> > + if (size < 0)
> > + size = 0;
> > +
> > + if ((virLogInitialized == 0) || (size * 1024 == virLogSize))
>
> Ouch - you didn't check for integer overflow before doing this multiply.
> You need to add something like:
We're turning pedantic here. It's a manual configuration, and code
used a priori only once at startup.
> if (INT_MAX / 1024 < size) {
> VIR_WARN("requested log size too large: %d", size);
> return -1;
> }
Same thing VIR_WARN would deadlock here.
> > + return ret;
> > +
> > + virLogLock();
> > +
> > + oldsize = virLogSize;
> > + oldLogBuffer = virLogBuffer;
> > +
> > + virLogSize = size * 1024;
> > + if (VIR_ALLOC_N(virLogBuffer, virLogSize) < 0) {
> > + virReportOOMError();
> > + virLogBuffer = oldLogBuffer;
> > + virLogSize = oldsize;
> > + ret =-1;
>
> Spacing looks awkward, s/=-1/= -1/
>
> > @@ -350,23 +408,28 @@ virLogEmergencyDumpAll(int signum) {
> > virLogDumpAllFD( "Caught unexpected signal", -1);
> > break;
> > }
> > + if ((virLogBuffer == NULL) || (virLogSize <= 0)) {
> > + virLogDumpAllFD(" internal log buffer desactivated\n", -1);
>
> s/desactivated/deactivated/
thanks,
Daniel
--
Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/
daniel at veillard.com | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library http://libvirt.org/
More information about the libvir-list
mailing list