I traced down a problem I am having to the following simple test case. (see code below)
If we remove the EntryComparisonDelegate from the the secondary database config, everything works fine.
Otherwise I get either of the following errors:
CallbackOnCollectedDelegate was detected
Message: A callback was made on a garbage collected delegate of type 'libdb_dotnet50!BerkeleyDB.Internal.BDB_CompareDelegate::Invoke'. This may cause application crashes, corruption and data loss. When passing delegates to unmanaged code, they must be kept alive by the managed application until it is guaranteed that they will never be called.
at this location
libdb_dotnet50.dll!BerkeleyDB.Internal.DB.put(BerkeleyDB.Internal.DB_TXN txn = null, BerkeleyDB.DatabaseEntry key = {BerkeleyDB.DatabaseEntry}, BerkeleyDB.DatabaseEntry data = {BerkeleyDB.DatabaseEntry}, uint flags = 0) Line 273 + 0x6e bytes C#
or
System.AccessViolationException was unhandled
Message=Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
Source=libdb_dotnet50
StackTrace:
at BerkeleyDB.Internal.libdb_csharpPINVOKE.DB_put(HandleRef jarg1, HandleRef jarg2, HandleRef jarg3, HandleRef jarg4, UInt32 jarg5)
at BerkeleyDB.Internal.DB.put(DB_TXN txn, DatabaseEntry key, DatabaseEntry data, UInt32 flags) in Z:\db-5.0.26\csharp\Internal\DB.cs:line 273
at BerkeleyDB.Database.Put(DatabaseEntry key, DatabaseEntry data, Transaction txn, UInt32 flags) in Z:\db-5.0.26\csharp\Database.cs:line 650
at BerkeleyDB.Database.Put(DatabaseEntry key, DatabaseEntry data, Transaction txn) in Z:\db-5.0.26\csharp\Database.cs:line 595
at BerkeleyDB.Database.Put(DatabaseEntry key, DatabaseEntry data) in Z:\db-5.0.26\csharp\Database.cs:line 576
at ConsoleApplication1.Program.Main(String[] args) in c:\users\administrator\documents\visual studio 10\Projects\ConsoleApplication10\ConsoleApplication1\Program.cs:line 44
at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
InnerException:
class Program
{
static DatabaseEntry keyGen(DatabaseEntry k, DatabaseEntry d)
{
return new DatabaseEntry(new byte[] { 1, 2, 3, 4 });
}
static int comp(DatabaseEntry k1, DatabaseEntry k2)
{
return 0;
}
static void Main(string[] args)
{
if (File.Exists("data.db")) File.Delete("data.db");
Database db = BTreeDatabase.Open("data.db", "master", new BTreeDatabaseConfig()
{
Creation = CreatePolicy.IF_NEEDED
});
SecondaryDatabase sdb = SecondaryBTreeDatabase.Open("data.db", "index", new SecondaryBTreeDatabaseConfig(db, keyGen)
{
Creation = CreatePolicy.IF_NEEDED,
Duplicates = DuplicatesPolicy.SORTED,
Compare = comp
});
for (int i = 0; i < 100; i++)
{
byte[] b = BitConverter.GetBytes(i).Reverse().ToArray();
db.Put(new DatabaseEntry(b), new DatabaseEntry(b));
GC.Collect();
}
sdb.Close();
db.Close();
}
}
I am using
db-5.0.26
visual studio 2010 / .net 4.0
windows 2008 server
Any ideas on what I am doing wrong?