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)); } } }
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); }
public string GetStatus(LogStreamerSession sess) { return GetStatus(sess.PeerGuid); }
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() }; } }
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(" [<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>"); }