Files
mars-flaim/xflaim/csharp/cstest/StatsTests.cs
2006-09-26 14:55:33 +00:00

292 lines
8.3 KiB
C#

//------------------------------------------------------------------------------
// 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);
}
}
}