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;
     }
 }
Ejemplo n.º 6
0
 public void Serialize(LogReadResult lrr)
 {
     Serialize(Magic.TypeLogReadResult);
     Serialize(lrr.ContinuationPosition);
     Serialize(lrr.TransactionData);
 }
Ejemplo n.º 7
0
 public Transaction(Deserializer rd)
 {
     LogReadResult = rd.DeserializeLogReadResult();
 }
Ejemplo n.º 8
0
 public Transaction(LogReadResult lrr)
 {
     LogReadResult = lrr;
 }