private bool FilterTransaction(LogReadResult lrr) { var tran = lrr.TransactionData; var commitId = lrr.ContinuationPosition.CommitID; int index; index = 0; while (index < tran.Creates.Count) { var record = tran.Creates[index]; if (record.Table.StartsWith("LogStreamer.")) { if (record.Table == "LogStreamer.LastPosition" && FilterLoops(record.Columns)) { return true; } tran.Creates.RemoveAt(index); continue; } if (FilterTable(record.Table, commitId)) { tran.Creates.RemoveAt(index); continue; } index++; } index = 0; while (index < tran.Updates.Count) { var record = tran.Updates[index]; if (record.Table.StartsWith("LogStreamer.")) { if (record.Table == "LogStreamer.LastPosition" && FilterLoops(record.Columns)) { return true; } tran.Updates.RemoveAt(index); continue; } if (FilterTable(record.Table, commitId)) { tran.Updates.RemoveAt(index); continue; } index++; } index = 0; while (index < tran.Deletes.Count) { var record = tran.Deletes[index]; if (record.Table.StartsWith("LogStreamer.")) { tran.Deletes.RemoveAt(index); continue; } if (FilterTable(record.Table, commitId)) { tran.Deletes.RemoveAt(index); continue; } index++; } if (tran.Updates.Count == 0 && tran.Creates.Count == 0 && tran.Deletes.Count == 0) { // transaction is empty return true; } return false; }
// Must run on a SC thread private void ProcessIncomingTransaction(LogReadResult lrr) { Debug.Assert(StarcounterEnvironment.IsOnScheduler()); try { string peerTableIdPrefix = PeerTableIdPrefix; Db.Advanced.Transact(_transactionOptions, () => { _applicator.Apply(lrr.TransactionData); if (PeerHasFilters) { ForAllTablesInTransaction(lrr, (tableName) => UpdateCommitId(peerTableIdPrefix + tableName, lrr.ContinuationPosition.CommitID)); } else { UpdateCommitId(peerTableIdPrefix, lrr.ContinuationPosition.CommitID); } }); Interlocked.Increment(ref _transactionsReceived); } catch (Exception e) { uint code; // Special handling for ScErrTableNotFound (SCERR4230) and ScErrSchemaCodeMismatch (SCERR4177) if (ErrorCode.TryGetCode(e, out code)) { if (code == 4230 || code == 4177) { // compare transaction classes with currently loaded classes to find which ones are missing var tableset = new HashSet<string>(); ForAllTablesInTransaction(lrr, (tableName) => tableset.Add(tableName)); Db.Transact(() => { foreach (Starcounter.Metadata.ClrClass cc in Db.SQL<Starcounter.Metadata.ClrClass>("SELECT cc FROM Starcounter.Metadata.ClrClass cc")) { tableset.Remove(cc.FullClassName); } }); if (tableset.Count > 0) { var sb = new StringBuilder(); sb.Append("Class not loaded:"); foreach (var tableName in tableset) { sb.Append(' '); sb.Append(tableName); } Quit(sb.ToString()); return; } } } throw; } }
static public StringBuilder Serialize(StringBuilder sb, LogReadResult lrr) { sb.Append(TypeLogReadResult); Serialize(sb, lrr.continuation_position); Serialize(sb, lrr.transaction_data); sb.Append(' '); return sb; }
private void ForAllTablesInTransaction(LogReadResult tran, Action<string> action) { for (int index = tran.TransactionData.Creates.Count - 1; index >= 0; index--) action(tran.TransactionData.Creates[index].Table); for (int index = tran.TransactionData.Updates.Count - 1; index >= 0; index--) action(tran.TransactionData.Updates[index].Table); for (int index = tran.TransactionData.Deletes.Count - 1; index >= 0; index--) action(tran.TransactionData.Deletes[index].Table); return; }
// Must run on a SC thread private void ProcessIncomingTransaction(LogReadResult lrr) { try { Db.Advanced.Transact(_transactionOptions, () => { ulong commitId = lrr.continuation_position.commit_id; if (PeerHasFilters) { ForAllTablesInTransaction(lrr, (tableName) => UpdateCommitId(tableName, commitId)); } else { UpdateCommitId(string.Empty, commitId); } _applicator.Apply(lrr.transaction_data); }); TransactionsReceived++; } catch (Exception e) { uint code; // Special handling for ScErrTableNotFound (SCERR4230) and ScErrSchemaCodeMismatch (SCERR4177) if (ErrorCode.TryGetCode(e, out code)) { if (code == 4230 || code == 4177) { // compare transaction classes with currently loaded classes to find which ones are missing var tableset = new HashSet<string>(); ForAllTablesInTransaction(lrr, (tableName) => tableset.Add(tableName)); Db.Transact(() => { foreach (Starcounter.Metadata.ClrClass cc in Db.SQL<Starcounter.Metadata.ClrClass>("SELECT cc FROM Starcounter.Metadata.ClrClass cc")) { tableset.Remove(cc.FullClassName); } }); if (tableset.Count > 0) { var sb = new StringBuilder(); sb.Append("Class not loaded:"); foreach (var tableName in tableset) { sb.Append(' '); sb.Append(tableName); } Quit(sb.ToString()); return; } } } throw; } }
public void Serialize(LogReadResult lrr) { Serialize(Magic.TypeLogReadResult); Serialize(lrr.ContinuationPosition); Serialize(lrr.TransactionData); }
public Transaction(Deserializer rd) { LogReadResult = rd.DeserializeLogReadResult(); }
public Transaction(LogReadResult lrr) { LogReadResult = lrr; }