void Prepare(out SimpleFunctions f, out ClientSession <AdId, NumClicks, NumClicks, NumClicks, Empty, SimpleFunctions> s1, out UnsafeContext <AdId, NumClicks, NumClicks, NumClicks, Empty, SimpleFunctions> uc1, out ThreadSession <AdId, NumClicks, NumClicks, NumClicks, Empty, SimpleFunctions> s2, long toVersion = -1) { f = new SimpleFunctions(); // We should be in REST, 1 Assert.IsTrue(SystemState.Equal(SystemState.Make(Phase.REST, 1), fht1.SystemState)); // Take index checkpoint for recovery purposes fht1.TryInitiateIndexCheckpoint(out _); fht1.CompleteCheckpointAsync().AsTask().GetAwaiter().GetResult(); // Index checkpoint does not update version, so // we should still be in REST, 1 Assert.IsTrue(SystemState.Equal(SystemState.Make(Phase.REST, 1), fht1.SystemState)); NumClicks value; s1 = fht1.For(f).NewSession <SimpleFunctions>("foo"); for (int key = 0; key < numOps; key++) { value.numClicks = key; s1.Upsert(ref inputArray[key], ref value, Empty.Default, key); } // Ensure state machine needs no I/O wait during WAIT_FLUSH fht1.Log.ShiftReadOnlyAddress(fht1.Log.TailAddress, true); // Create unsafe context and hold epoch to prepare for manual state machine driver uc1 = s1.GetUnsafeContext(); uc1.ResumeThread(); // Start session s2 on another thread for testing s2 = fht1.For(f).CreateThreadSession(f); // We should be in REST, 1 Assert.IsTrue(SystemState.Equal(SystemState.Make(Phase.REST, 1), fht1.SystemState)); fht1.TryInitiateHybridLogCheckpoint(out _, CheckpointType.FoldOver, targetVersion: toVersion); // We should be in PREPARE, 1 Assert.IsTrue(SystemState.Equal(SystemState.Make(Phase.PREPARE, 1), fht1.SystemState)); }
void Prepare(out SimpleFunctions f, out ClientSession <AdId, NumClicks, NumClicks, NumClicks, Empty, SimpleFunctions> s1, out ThreadSession <AdId, NumClicks, NumClicks, NumClicks, Empty, SimpleFunctions> s2) { f = new SimpleFunctions(); // We should be in REST, 1 Assert.IsTrue(SystemState.Equal(SystemState.Make(Phase.REST, 1), fht1.SystemState)); // Take index checkpoint for recovery purposes fht1.TakeIndexCheckpoint(out _); fht1.CompleteCheckpointAsync().GetAwaiter().GetResult(); // Index checkpoint does not update version, so // we should still be in REST, 1 Assert.IsTrue(SystemState.Equal(SystemState.Make(Phase.REST, 1), fht1.SystemState)); NumClicks value; s1 = fht1.For <NumClicks, NumClicks, Empty>().NewSession(f, "foo", threadAffinitized: true); for (int key = 0; key < numOps; key++) { value.numClicks = key; s1.Upsert(ref inputArray[key], ref value, Empty.Default, key); } // Ensure state machine needs no I/O wait during WAIT_FLUSH fht1.Log.ShiftReadOnlyAddress(fht1.Log.TailAddress, true); // Start affinitized session s2 on another thread for testing s2 = fht1.For <NumClicks, NumClicks, Empty>().CreateThreadSession(f, threadAffinized: true); // We should be in REST, 1 Assert.IsTrue(SystemState.Equal(SystemState.Make(Phase.REST, 1), fht1.SystemState)); fht1.TakeHybridLogCheckpoint(out _); // We should be in PREPARE, 1 Assert.IsTrue(SystemState.Equal(SystemState.Make(Phase.PREPARE, 1), fht1.SystemState)); }