
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@veillard.com | Rpmfind RPM search engine http://rpmfind.net/ http://veillard.com/ | virtualization library http://libvirt.org/