Skip to content

Commit

Permalink
Merge pull request warrenfalk#18 from roeeiit1/master
Browse files Browse the repository at this point in the history
Fixed support for open as secondary with column families
  • Loading branch information
theolivenbaum committed Feb 1, 2022
2 parents d8e2d4b + 4924726 commit f2bc14b
Show file tree
Hide file tree
Showing 4 changed files with 101 additions and 8 deletions.
66 changes: 66 additions & 0 deletions Tests/SecondaryColumnFamilyRocksDbInstanceTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
using System.IO;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using RocksDbSharp;

namespace Tests
{
[TestClass]
public class SecondaryColumnFamilyRocksDbInstanceTests
{
private const string PRIMARY_DB_NAME = "test-primary";
private const string SECONDARY_DB_NAME = "test-secondary";
private RocksDb _primaryDb;
private RocksDb _secondaryDb;
private ColumnFamilyHandle _columnFamilyHandle;
private ColumnFamilyHandle _columnFamilyHandleSecondary;

[TestInitialize]
public void InitializeTest()
{
if (Directory.Exists(PRIMARY_DB_NAME))
{
Directory.Delete(PRIMARY_DB_NAME, true);
}

if (Directory.Exists(SECONDARY_DB_NAME))
{
Directory.Delete(SECONDARY_DB_NAME, true);
}

var options = new DbOptions().SetCreateIfMissing().SetCreateMissingColumnFamilies();
var columnFamilies = new ColumnFamilies();
columnFamilies.Add("TEST_COLUMN_FAMILY", new ColumnFamilyOptions());
_primaryDb = RocksDb.Open(options, PRIMARY_DB_NAME, columnFamilies);
_columnFamilyHandle = _primaryDb.GetColumnFamily("TEST_COLUMN_FAMILY");
_primaryDb.Put("one", "uno", _columnFamilyHandle);
_secondaryDb = RocksDb.OpenAsSecondary(options, PRIMARY_DB_NAME, SECONDARY_DB_NAME, columnFamilies);
_columnFamilyHandleSecondary = _secondaryDb.GetColumnFamily("TEST_COLUMN_FAMILY");
}

[TestMethod]
public void TestCatchUp()
{
Assert.AreEqual("uno", _secondaryDb.Get("one", _columnFamilyHandleSecondary));
_primaryDb.Put("two", "dos", _columnFamilyHandle);
Assert.IsNull(_secondaryDb.Get("two", _columnFamilyHandleSecondary));
_secondaryDb.TryCatchUpWithPrimary();
Assert.AreEqual("dos", _secondaryDb.Get("two", _columnFamilyHandleSecondary));
}

[TestCleanup]
public void CleanUpTest()
{
_primaryDb.Dispose();
_secondaryDb.Dispose();
if (Directory.Exists(PRIMARY_DB_NAME))
{
Directory.Delete(PRIMARY_DB_NAME, true);
}

if (Directory.Exists(SECONDARY_DB_NAME))
{
Directory.Delete(SECONDARY_DB_NAME, true);
}
}
}
}
8 changes: 4 additions & 4 deletions Tests/Tests.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,13 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.0.0"/>
<PackageReference Include="MSTest.TestAdapter" Version="2.2.8"/>
<PackageReference Include="MSTest.TestFramework" Version="2.2.8"/>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.0.0" />
<PackageReference Include="MSTest.TestAdapter" Version="2.2.8" />
<PackageReference Include="MSTest.TestFramework" Version="2.2.8" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\csharp\RocksDbSharp.csproj"/>
<ProjectReference Include="..\csharp\RocksDbSharp.csproj" />
</ItemGroup>

</Project>
27 changes: 26 additions & 1 deletion csharp/src/Native.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1013,7 +1013,32 @@ public rocksdb_t_ptr rocksdb_open_as_secondary_column_families(
throw new RocksDbException(errptr);
return result;
}


public abstract rocksdb_t_ptr rocksdb_open_as_secondary_column_families(
const_rocksdb_options_t_ptr options,
string name,
string secondary_path,
int num_column_families,
string[] column_family_names,
const_rocksdb_options_t_ptr[] column_family_options,
rocksdb_column_family_handle_t_ptr[] colummn_family_handles,
out char_ptr_ptr errptr);

public rocksdb_t_ptr rocksdb_open_as_secondary_column_families(
const_rocksdb_options_t_ptr options,
string name,
string secondary_path,
int num_column_families,
string[] column_family_names,
const_rocksdb_options_t_ptr[] column_family_options,
rocksdb_column_family_handle_t_ptr[] colummn_family_handles)
{
var result = rocksdb_open_as_secondary_column_families(options, name, secondary_path, num_column_families, column_family_names, column_family_options, colummn_family_handles, out char_ptr_ptr errptr);
if (errptr != IntPtr.Zero)
throw new RocksDbException(errptr);
return result;
}

public abstract char_ptr_ptr rocksdb_list_column_families(
const_rocksdb_options_t_ptr options,
const_char_ptr name,
Expand Down
8 changes: 5 additions & 3 deletions csharp/src/RocksDb.cs
Original file line number Diff line number Diff line change
Expand Up @@ -133,12 +133,14 @@ public static RocksDb OpenReadOnly(DbOptions options, string path, ColumnFamilie
public static RocksDb OpenAsSecondary(DbOptions options, string path, string secondaryPath, ColumnFamilies columnFamilies)
{
string[] cfnames = columnFamilies.Names.ToArray();
IntPtr[] cfoptions = columnFamilies.OptionHandles.ToArray();
IntPtr[] cfhandles = new IntPtr[cfnames.Length];
var db = Native.Instance.rocksdb_open_as_secondary(options.Handle, path, secondaryPath);
var db = Native.Instance.rocksdb_open_as_secondary_column_families(options.Handle, path, secondaryPath, cfnames.Length, cfnames, cfoptions, cfhandles);
var cfHandleMap = new Dictionary<string, ColumnFamilyHandleInternal>();
foreach (var pair in cfnames.Zip(cfhandles.Select(cfh => new ColumnFamilyHandleInternal(cfh)),
(name, cfh) => new {Name = name, Handle = cfh}))
foreach (var pair in cfnames.Zip(cfhandles.Select(cfh => new ColumnFamilyHandleInternal(cfh)), (name, cfh) => new { Name = name, Handle = cfh }))
{
cfHandleMap.Add(pair.Name, pair.Handle);
}
return new RocksDb(db,
optionsReferences: options.References,
cfOptionsRefs: columnFamilies.Select(cfd => cfd.Options.References).ToArray(),
Expand Down

0 comments on commit f2bc14b

Please sign in to comment.