public FilteredLogReader(LogStreamerSession logStreamer, Dictionary<string, ulong> tablePos, HashSet<string> tableFilter)
        {
            _logStreamer = logStreamer;

            // make a copy of the table position dictionary, stripping out prefix
            if (tablePos != null && tablePos.Count > 0)
            {
                _tablePos = new Dictionary<string, ulong>(tablePos.Count);
                foreach (var kv in tablePos)
                {
                    _tablePos.Add(StripDatabasePrefix(kv.Key), kv.Value);
                }
            }

            // make a copy of the table filter set, stripping out prefix
            if (tableFilter != null)
            {
                _tableFilter = new HashSet<string>();
                foreach (var tableNameOrId in tableFilter)
                {
                    var tableName = StripDatabasePrefix(tableNameOrId);
                    if (tableName != string.Empty)
                    {
                        _tableFilter.Add(tableName);
                    }
                }
            }

            _reader = _logStreamer.LogManager.OpenLog(Starcounter.Internal.StarcounterEnvironment.DatabaseNameLower, LogStreamerParent.TransactionLogDirectory, new LogPosition { commit_id = FindStartCommitId() });
        }
 private void HandleOnStopped(LogStreamerSession child)
 {
     if (_children.Remove(child)) {
         child.Dispose();
         return;
     }
     Debug.WriteLine(string.Format("HandleOnStopped: Unknown child {0}", child.PeerGuid));
     Debug.Assert(false);
 }
 private void HandleOnIdentified(LogStreamerSession child)
 {
     foreach (var old in _children) {
         if (old != child) {
             if (!old.IsStopping && old.PeerGuid == child.PeerGuid) {
                 old.Status = string.Format("Replaced by session {0}", child.SessionId);
                 old.Cancel();
             }
         }
     }
 }
        public FilteredLogReader(LogStreamerSession logStreamer, Dictionary<string, ulong> tablePos, HashSet<string> tableFilter) {
            _logStreamer = logStreamer;

            // make a copy of the table position dictionary, stripping out prefix
            if (tablePos != null && tablePos.Count > 0) {
                _tablePos = new Dictionary<string, ulong>(tablePos.Count);
                foreach (var kv in tablePos) {
                    _tablePos.Add(StripDatabasePrefix(kv.Key), kv.Value);
                }
            }

            // make a copy of the table filter set, stripping out prefix
            if (tableFilter != null) {
                _tableFilter = new HashSet<string>();
                foreach (var tableNameOrId in tableFilter) {
                    _tableFilter.Add(StripDatabasePrefix(tableNameOrId));
                }
            }
        }
Esempio n. 5
0
 public void Log(LogStreamerSession session, EntryKind kind, string msg)
 {
     if (session != null) {
         Log(new LogEntry() {
             SessionId = session.SessionId,
             When = DateTime.Now,
             Kind = kind,
             Guid = session.PeerGuid,
             Name = session.PeerDatabaseName,
             Message = msg
         });
         return;
     }
     Log(new LogEntry() {
         SessionId = 0,
         When = DateTime.Now,
         Kind = kind,
         Guid = Guid.Empty,
         Name = string.Empty,
         Message = msg
     });
 }
 private void HandleOnStopped()
 {
     string msg = string.Empty;
     IsConnected = false;
     if (Session != null) {
         if (Session.TransactionsReceived > 0 || Session.TransactionsSent > 0) {
             ReconnectInterval = _reconnectMinimum;
         }
         msg = Session.QuitMessage;
         Session.Dispose();
         Session = null;
     }
     Reconnect(msg);
 }
        public void HandleConnected(Task t)
        {
            Debug.Assert(Session == null);

            if (t.IsCanceled || _ct.IsCancellationRequested) {
                SetStatus("Cancelled connection attempt");
                return;
            }

            if (t.IsFaulted) {
                var e = t.Exception.GetBaseException();
                while (e.InnerException != null)
                    e = e.InnerException;
                if (e.GetType() == typeof(System.Net.Sockets.SocketException)
                    || e.GetType() == typeof(WebSocketException)) {
                    Debug.WriteLine(e.ToString());
                    _logger?.Log(null, Logger.EntryKind.SetStatus, e.Message);
                } else {
                    _logger?.Log(null, Logger.EntryKind.SetStatus, e.ToString());
                }
                Reconnect(e.Message);
                return;
            }

            SetStatus("Connected");
            Session = new LogStreamerSession(_logger, _tc.GetStream(), _manager, _ct, _tablePrios);
            Session.OnStopped = HandleOnStopped;
            Session.ScheduleTask(Session.Start);
        }
Esempio n. 8
0
 public string GetStatus(LogStreamerSession sess)
 {
     return GetStatus(sess.PeerGuid);
 }
Esempio n. 9
0
 public void SetStatus(LogStreamerSession sess, string status)
 {
     SetStatus(sess.PeerGuid, status);
 }
        private void ListenThread()
        {
            var uri = new Uri(_config.ListenUri);
            var listenAddr = IPAddress.Any;
            if (!string.IsNullOrWhiteSpace(uri.Host)) {
                foreach (var addr in Dns.GetHostEntry(uri.Host).AddressList) {
                    if (listenAddr == IPAddress.Any)
                        listenAddr = addr;
                    if (listenAddr.AddressFamily == AddressFamily.InterNetworkV6 &&
                        addr.AddressFamily == AddressFamily.InterNetwork)
                        listenAddr = addr;
                }
            }
            var listenPort = uri.Port < 1 ? StarcounterEnvironment.Default.UserHttpPort + 1000 : uri.Port;

            var listener = new TcpListener(listenAddr, listenPort);

            try {
                listener.Start();
            } catch (Exception e) {
                ErrorMessage = string.Format("LogStreamer failed to start listener on \"{0}:{1}\": {2}", listenAddr, listenPort, e.Message);
                Debug.WriteLine(ErrorMessage);
                return;
            }

            try {
                ListenAddr = listenAddr;
                ListenPort = listenPort;
                while (!_ct.IsCancellationRequested) {
                    try {
                        var tc = listener.AcceptTcpClient();
                        var session = new LogStreamerSession(_logger, tc.GetStream(), _logmanager, _ct, _tablePrios);
                        session.OnIdentified = () => HandleOnIdentified(session);
                        session.OnStopped = () => HandleOnStopped(session);
                        Debug.Assert(!_children.Contains(session));
                        _children.Add(session);
                        Starcounter.Scheduling.ScheduleTask(session.Start);
                    } catch (Exception e) {
                        ErrorMessage = e.ToString();
                        break;
                    }
                }
            } finally {
                listener.Stop();
                ListenAddr = IPAddress.None;
                ListenPort = 0;
            }
        }
 public void HandleConnected(Task t)
 {
     if (t.IsCanceled || _ct.IsCancellationRequested)
     {
         return;
     }
     if (t.IsFaulted)
     {
         Reconnect(t.Exception);
         return;
     }
     Program.Status = "Connected to " + _sourceUri.ToString();
     _source = new LogStreamerSession(new DotNetWebSocketSender(_ws), _manager, _ct, _tablePrios);
     _ws.ReceiveAsync(new ArraySegment<byte>(_rdbuf), _ct).ContinueWith(HandleReceive);
 }
 public void Reconnect(Exception e = null)
 {
     IsConnected = false;
     string msg = null;
     if (_source != null)
     {
         // TODO: need better heuristic on this
         if (_source.TransactionsReceived > 0 || _source.TransactionsSent > 0)
         {
             ReconnectInterval = _reconnectMinimum;
         }
         msg = _source.QuitMessage;
         _source.Dispose();
         _source = null;
     }
     if (e != null)
     {
         if (msg == null || msg == "")
         {
             if (e.InnerException == null)
                 msg = e.Message;
             else
                 msg = e.InnerException.Message;
         }
         Console.WriteLine("LogStreamerChild.Reconnect: \"{0}\": Exception {1}", _sourceUri, e);
     }
     if (msg == null)
         msg = "";
     if (msg != "")
         msg = "\"" + msg + "\": ";
     if (_ct.IsCancellationRequested)
     {
         Program.Status = _sourceUri.ToString() + ": " + msg + "Cancelled";
         return;
     }
     TimeSpan span = TimeSpan.FromMilliseconds(1000 * ReconnectInterval);
     Program.Status = _sourceUri.ToString() + ": " + msg + "Reconnect at " + (DateTime.Now + span);
     ReconnectInterval = ReconnectInterval * 2;
     Task.Delay(span, _ct).ContinueWith(Connect);
     return;
 }
        private Response HandleConnect(Request req)
        {
            /*
            if (_ct.IsCancellationRequested)
            {
                return new Response()
                {
                    StatusCode = 503,
                    StatusDescription = "Service Unavailable"
                };
            }
            */

            try
            {
                if (!req.WebSocketUpgrade)
                {
                    return new Response()
                    {
                        StatusCode = 400,
                        StatusDescription = "Bad Request"
                    };
                }
                UInt64 wsId = req.GetWebSocketId();
                WebSocket ws = req.SendUpgrade(Program.LogStreamerWebsocketProtocol, null, null, null);
                _children[wsId] = new LogStreamerSession(new StarcounterWebSocketSender(this, wsId), _logmanager, _ct, _tablePrios);
                return HandlerStatus.Handled;
            }
            catch (Exception exc)
            {
                return new Response()
                {
                    StatusCode = 500,
                    StatusDescription = "Internal Server Error",
                    Body = exc.ToString()
                };
            }
        }
Esempio n. 14
0
        private static void SessionStatus(StringBuilder sb, bool isUpstream, LogStreamerSession sess)
        {
            if (sess == null)
                return;
            sb.Append("<tr><td>#");
            sb.Append(sess.SessionId);
            sb.Append(isUpstream ? " U" : " D");
            sb.Append("</td><td>");
            sb.Append(sess.PeerGuidString);
            sb.Append("&nbsp;[<a href=\"/LogStreamer?close=");
            sb.Append(sess.SessionId);
            sb.Append("\">X</a>]</td><td>");
            sb.Append(sess.PeerDatabaseName);
            sb.Append("</td><td>");
            sb.Append(sess.TransactionsReceived);
            sb.Append("</td><td>");
            sb.Append(sess.TransactionsSent);
            sb.Append("</td><td>");
            sb.Append(sess.LogEntriesScanned);
            sb.Append("</td><td>");
            sb.Append(StrFormatByteSize(sess.TotalBytesRead));
            sb.Append("</td><td>");
            sb.Append(StrFormatByteSize(sess.TotalBytesWritten));
            sb.Append("</td><td>");
            sb.Append(sess.State);
            if (!string.IsNullOrEmpty(sess.Status) && sess.Status != sess.State.ToString()) {
                sb.Append("; ");
                sb.Append(sess.Status);
            }
            sb.Append("</td><td>");

            // Notes
            WriteNonzero(sb, " WsOut", sess.OutputQueueCount);
            var lravg = sess.LogReadAverageTime;
            if (lravg > 100)
                sb.AppendFormat(" AvgLogRead={0:#.##}ms", lravg / 1000.0);
            sb.Append("</td></tr>");
        }