//------------------------------------------------------------------------------ // Desc: Statistics tests // // Tabs: 3 // // Copyright (c) 2006 Novell, Inc. All Rights Reserved. // // This program is free software; you can redistribute it and/or // modify it under the terms of version 2 of the GNU General Public // License as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, contact Novell, Inc. // // To contact Novell about this file by physical or electronic mail, // you may find current contact information at www.novell.com // // $Id$ //------------------------------------------------------------------------------ using System; using System.IO; using System.Runtime.InteropServices; using xflaim; namespace cstest { //-------------------------------------------------------------------------- // Statistics tests. //-------------------------------------------------------------------------- public class StatsTests : Tester { private const uint LABEL_LEN = 35; private string makeIndentStr( uint uiIndent) { string sIndent = null; for (uint uiLoop = 0; uiLoop < uiIndent; uiLoop++) { sIndent += " "; } return( sIndent); } private string makeLabel( uint uiIndent, string sLabel) { string sNewLabel = makeIndentStr( uiIndent) + sLabel; while (sNewLabel.Length < LABEL_LEN) { sNewLabel += "."; } sNewLabel += " "; return( sNewLabel); } private void printStrStat( uint uiIndent, string sLabel, string sStat) { System.Console.WriteLine( "{0}{1}", makeLabel( uiIndent, sLabel), sStat); } private void printUIntStat( uint uiIndent, string sLabel, uint uiStat) { System.Console.WriteLine( "{0}{1}", makeLabel( uiIndent, sLabel), uiStat); } private void printULongStat( uint uiIndent, string sLabel, ulong ulStat) { System.Console.WriteLine( "{0}{1}", makeLabel( uiIndent, sLabel), ulStat); } private void printCountTimeStat( uint uiIndent, string sLabel, F_COUNT_TIME_STAT stat) { ulong ulAvgMilli = (stat.ulCount != 0) ? stat.ulElapMilli / stat.ulCount : 0; System.Console.WriteLine( "{0}Count={1},ElapMilli={2},AvgMilli={3}", makeLabel( uiIndent, sLabel), stat.ulCount, stat.ulElapMilli, ulAvgMilli); } private void printDiskIOStats( uint uiIndent, string sLabel, XFLM_DISKIO_STAT diskIOStat) { ulong ulAvgMilli = (diskIOStat.ulCount != 0) ? diskIOStat.ulElapMilli / diskIOStat.ulCount : 0; System.Console.WriteLine( "{0}Count={1},Bytes={2},ElapMilli={3},AvgMilli={4}", makeLabel( uiIndent, sLabel), diskIOStat.ulCount, diskIOStat.ulTotalBytes, diskIOStat.ulElapMilli, ulAvgMilli); } private void printBlockIOStats( uint uiIndent, string sLabel, XFLM_BLOCKIO_STATS blockIOStats) { System.Console.WriteLine( "{0}{1}", makeIndentStr( uiIndent), sLabel); printDiskIOStats( uiIndent + 1, "Block Reads", blockIOStats.BlockReads); printDiskIOStats( uiIndent + 1, "Block Writes", blockIOStats.BlockWrites); printDiskIOStats( uiIndent + 1, "Old View Block Reads", blockIOStats.OldViewBlockReads); printUIntStat( uiIndent + 1, "Block Checksum Errors", blockIOStats.uiBlockChkErrs); printUIntStat( uiIndent + 1, "Old Block Checksum Errors", blockIOStats.uiOldViewBlockChkErrs); printUIntStat( uiIndent + 1, "Old View Errors", blockIOStats.uiOldViewErrors); } public bool statsTests( string sDbName, DbSystem dbSystem) { Db db = null; DbSystemStats stats = null; uint uiNumDatabases; uint uiStartTime; uint uiStopTime; CS_XFLM_DB_STATS dbStats = null; CS_XFLM_LFILE_STATS lFileStats = null; beginTest( "Start statistics"); try { dbSystem.startStats(); } catch (XFlaimException ex) { endTest( false, ex, "starting statistics"); return( false); } endTest( false, true); // Open a database to make some statistics happen beginTest( "Open Database Test (" + sDbName + ")"); try { db = dbSystem.dbOpen( sDbName, null, null, null, false); } catch (XFlaimException ex) { endTest( false, ex, "opening database"); return( false); } if (db != null) { db.close(); db = null; } endTest( false, true); // Stop collecting statistics beginTest( "Stop statistics"); try { dbSystem.stopStats(); } catch (XFlaimException ex) { endTest( false, ex, "stopping statistics"); return( false); } endTest( false, true); // Get statistics beginTest( "Get statistics"); try { stats = dbSystem.getStats(); } catch (XFlaimException ex) { endTest( false, ex, "getting statistics"); return( false); } endTest( false, true); // Get general statistics beginTest( "Get general statistics"); try { stats.getGeneralStats( out uiNumDatabases, out uiStartTime, out uiStopTime); } catch (XFlaimException ex) { endTest( false, ex, "getting statistics"); return( false); } endTest( false, true); printUIntStat( 0, "Databases", uiNumDatabases); printUIntStat( 0, "Start Time", uiStartTime); printUIntStat( 0, "Stop Time", uiStopTime); // Get Database statistics for (uint uiLoop = 0; uiLoop < uiNumDatabases; uiLoop++) { beginTest( "Get database statistics for DB#" + uiLoop); try { dbStats = stats.getDbStats( uiLoop, dbStats); } catch (XFlaimException ex) { endTest( false, ex, "getting database statistics"); return( false); } endTest( false, true); printStrStat( 0, "Database Name", dbStats.sDbName); printUIntStat( 0, "Logical File Count", dbStats.uiNumLFiles); System.Console.WriteLine( "Read Transactions"); printCountTimeStat( 1, "Committed Transactions", dbStats.ReadTransStats.CommittedTrans); printCountTimeStat( 1, "Aborted Transactions", dbStats.ReadTransStats.AbortedTrans); System.Console.WriteLine( "Update Transactions"); printCountTimeStat( 1, "Committed Transactions", dbStats.UpdateTransStats.CommittedTrans); printCountTimeStat( 1, "Aborted Transactions", dbStats.UpdateTransStats.AbortedTrans); printCountTimeStat( 1, "Group Completes", dbStats.UpdateTransStats.GroupCompletes); printULongStat( 1, "Group Finished", dbStats.UpdateTransStats.ulGroupFinished); printBlockIOStats( 0, "LFH Block Stats", dbStats.LFHBlockStats); printBlockIOStats( 0, "Avail Block Stats", dbStats.AvailBlockStats); printDiskIOStats( 0, "Database Header Writes", dbStats.DbHdrWrites); printDiskIOStats( 0, "Log Block Writes", dbStats.LogBlockWrites); printDiskIOStats( 0, "Log Block Restores", dbStats.LogBlockRestores); printDiskIOStats( 0, "Log Block Reads", dbStats.LogBlockReads); printUIntStat( 0, "Log Block Checksum Errors", dbStats.uiLogBlockChkErrs); printUIntStat( 0, "Read Errors", dbStats.uiReadErrors); printCountTimeStat( 0, "No Locks", dbStats.LockStats.NoLocks); printCountTimeStat( 0, "Waiting For Lock", dbStats.LockStats.WaitingForLock); printCountTimeStat( 0, "Held Lock", dbStats.LockStats.HeldLock); for (uint uiLoop2 = 0; uiLoop2 < dbStats.uiNumLFiles; uiLoop2++) { beginTest( " Get database statistics for DB#" + uiLoop + ", LFile#" + uiLoop2); try { lFileStats = stats.getLFileStats( uiLoop, uiLoop2, lFileStats); } catch (XFlaimException ex) { endTest( false, ex, "getting logical file statistics"); return( false); } endTest( false, true); System.Console.WriteLine( " LOGICAL FILE {0} ({1})", lFileStats.uiLFileNum, lFileStats.eLfType); printBlockIOStats( 2, "Root Block Stats", lFileStats.RootBlockStats); printBlockIOStats( 2, "Middle Block Stats", lFileStats.MiddleBlockStats); printBlockIOStats( 2, "Leaf Block Stats", lFileStats.LeafBlockStats); printULongStat( 2, "Block Splits", lFileStats.ulBlockSplits); printULongStat( 2, "Block Combines", lFileStats.ulBlockCombines); } } return( true); } } }