public void TestWriteLock() { var systemClock = new SystemClock(); var site = new Site(1, new SiteList(systemClock), systemClock); var tempVariable = new Variable(1, site, systemClock); var transactionOne = new Transaction("T1", systemClock); var transactionTwo = new Transaction("T2", systemClock); var result = tempVariable.GetWriteLock(transactionOne); Assert.IsTrue(result.Contains(transactionOne)); Assert.IsTrue(tempVariable.WriteLockHolder == transactionOne); var resultTwo = tempVariable.GetReadLock(transactionTwo); Assert.IsFalse(resultTwo.Contains(transactionTwo)); Assert.IsTrue(resultTwo.Contains(transactionOne)); var resultThree = tempVariable.GetWriteLock(transactionTwo); Assert.IsFalse(resultThree.Contains(transactionTwo)); Assert.IsTrue(resultThree.Contains(transactionOne)); tempVariable.RemoveWriteLock(transactionOne); Assert.IsTrue(tempVariable.WriteLockHolder == null); }
private static void Main(string[] args) { _systemClock = new SystemClock(); _siteList = new SiteList(_systemClock); _transactionList = new TransactionList(_systemClock); State.output = new List<string>(); State.Clock = _systemClock; InitializeSites(); GetFile(); List<string> file = ReadFile(); var errors = new List<String>(); _executionPlan = InputParser.ReadInput(file, _transactionList, _siteList, _systemClock, ref errors); Debug.WriteLine("System starting..."); if (errors.Count == 0) { //main execution loop foreach (ExecutionEntity currentEntity in _executionPlan) { foreach (BaseAction tempAction in currentEntity.Actions) { ProcessEntity(tempAction); } ProcessPausedTransactions(); _systemClock.Tick(); } } else { Console.WriteLine("Execution stopped, errors encountered: "); foreach (String error in errors) { Console.WriteLine(error); } } foreach (String outpt in State.output) Console.WriteLine(outpt); FileOutput.WriteFile(_fileName, State.output); Console.ReadLine(); }
public Write(string commandText, TransactionList transactionList, SiteList siteList, SystemClock systemClock) : base(commandText, transactionList, siteList, systemClock) { string[] info = commandText.Split(new[] { '(', ')' }); if (info.Length != 3) throw new Exception("Invalid command format: " + commandText); string[] parameters = info[1].Split(','); parameters = InputParser.TrimStringList(parameters); Transaction = transactionList.GetTransaction(parameters[0]); if (Transaction == null) throw new Exception("Transaction not found: " + commandText); VariableId = parameters[1]; Value = parameters[2]; }
/// <summary> /// Reads the file input and converts it into a list of execution plans. /// </summary> /// <param name="fileInput">The file input.</param> /// <param name="transactionList">The transaction list.</param> /// <param name="siteList">The site list.</param> /// <param name="systemClock">The system clock.</param> /// <param name="errorList">The error list.</param> /// <returns></returns> public static List<ExecutionEntity> ReadInput(List<string> fileInput, TransactionList transactionList, SiteList siteList, SystemClock systemClock, ref List<String> errorList) { var entities = new List<ExecutionEntity>(); foreach (String currentLine in fileInput) { List<string> lineElements = BreakLine(currentLine); var tempExecutionEntiy = new ExecutionEntity(); foreach (String tempElement in lineElements) { BaseAction result = StringToAction(tempElement, transactionList, siteList, systemClock, ref errorList); if (result != null) tempExecutionEntiy.AddAction(result); } entities.Add(tempExecutionEntiy); } //initialized all used variables at each site foreach (ExecutionEntity currentEntity in entities) { foreach (BaseAction tempAction in currentEntity.Actions) { if (tempAction is Read) { siteList.GetRunningSitesWithVariable(((Read)tempAction).VariableId); } else if (tempAction is Write) { siteList.GetRunningSitesWithVariable(((Write)tempAction).VariableId); } } } return entities; }
public void TestVariableResetOnFailure() { var systemClock = new SystemClock(); var site = new Site(1, new SiteList(systemClock), systemClock); var variable = new Variable(1, site, systemClock); var transactionOne = new Transaction("T1", systemClock); variable.GetReadLock(transactionOne); variable.GetWriteLock(transactionOne); Assert.IsTrue(variable.IsReadLocked); Assert.IsTrue(variable.IsWriteLocked); Assert.IsTrue(variable.ReadLockHolders.Contains(transactionOne)); Assert.IsTrue(variable.WriteLockHolder == transactionOne); variable.ResetToComitted(); Assert.IsFalse(variable.IsReadLocked); Assert.IsFalse(variable.IsWriteLocked); Assert.IsFalse(variable.ReadLockHolders.Contains(transactionOne)); Assert.IsFalse(variable.WriteLockHolder == transactionOne); }
public void TestAcquireAndRemoveReadLock() { var systemClock = new SystemClock(); var site = new Site(1, new SiteList(systemClock), systemClock); var tempVariable = new Variable(1, site, systemClock); var transactionOne = new Transaction("T1", systemClock); var transactionTwo = new Transaction("T2", systemClock); var result = tempVariable.GetReadLock(transactionOne); Assert.IsTrue(result.Contains(transactionOne)); var result2 = tempVariable.GetReadLock(transactionTwo); Assert.IsTrue(result.Contains(transactionOne)); Assert.IsTrue(result.Contains(transactionTwo)); tempVariable.RemoveReadLock(transactionOne); Assert.IsFalse(tempVariable.ReadLockHolders.Contains(transactionOne)); tempVariable.RemoveReadLock(transactionTwo); Assert.IsFalse(tempVariable.ReadLockHolders.Contains(transactionTwo)); }
//[TestMethod] public void TestMethod1() { var systemClock = new SystemClock(); var siteList = new SiteList(systemClock); var siteOne = new Site(1, siteList, systemClock); var siteTwo = new Site(2, siteList, systemClock); siteList.AddSite(siteOne); siteList.AddSite(siteTwo); var variableOne = new Variable(2, siteOne, systemClock); var variableTwo = new Variable(2, siteTwo, systemClock); var transaction = new Transaction("test", systemClock); siteOne.VariableList.Add(variableOne); siteTwo.VariableList.Add(variableTwo); Assert.IsTrue(variableOne.GetWriteLock(transaction).Contains(transaction)); Assert.IsTrue(variableTwo.GetWriteLock(transaction).Contains(transaction)); variableOne.Set("5"); variableOne.CommitValue(); variableOne.Set("4"); var affectedTranasactions = siteOne.Fail(); Assert.IsTrue(siteOne.IsFailed); siteOne.Recover(); Assert.IsTrue(affectedTranasactions.Contains(transaction)); Assert.IsTrue( transaction.AwaitingReReplication.Contains(new ValueSitePair() { Site = siteOne, Variable = variableOne })); Assert.IsFalse(siteOne.IsFailed); }
public static BaseAction StringToAction(String lineElement, TransactionList transactionList, SiteList siteList, SystemClock systemClock, ref List<String> errorList) { lineElement = lineElement.Trim(); string command = lineElement.Split('(').FirstOrDefault(); if (String.IsNullOrEmpty(command)) { errorList.Add("Invalid Command Format: " + lineElement); return null; } command = command.ToLower(); if (command.Equals("begin") || command.Equals("beginro")) return new BeginTransaction(lineElement, transactionList, siteList, systemClock); if (command.Equals("end")) return new EndTransaction(lineElement, transactionList, siteList, systemClock); if (command.Equals("r")) return new Read(lineElement, transactionList, siteList, systemClock); if (command.Equals("w")) return new Write(lineElement, transactionList, siteList, systemClock); if (command.Equals("fail")) return new Fail(lineElement, transactionList, siteList, systemClock); if (command.Equals("recover")) return new Recover(lineElement, transactionList, siteList, systemClock); if (command.Equals("dump")) return new Dump(lineElement, transactionList, siteList, systemClock); errorList.Add("Couldn't interpret: " + lineElement); return null; }