internal EventResponse(ResponseFrame frame) : base(frame) { string eventTypeString = BeBinaryReader.ReadString(); if (eventTypeString == "TOPOLOGY_CHANGE") { var ce = new TopologyChangeEventArgs(); ce.What = BeBinaryReader.ReadString() == "NEW_NODE" ? TopologyChangeEventArgs.Reason.NewNode : TopologyChangeEventArgs.Reason.RemovedNode; ce.Address = BeBinaryReader.ReadInet(); CassandraEventArgs = ce; return; } if (eventTypeString == "STATUS_CHANGE") { var ce = new StatusChangeEventArgs(); ce.What = BeBinaryReader.ReadString() == "UP" ? StatusChangeEventArgs.Reason.Up : StatusChangeEventArgs.Reason.Down; ce.Address = BeBinaryReader.ReadInet(); CassandraEventArgs = ce; return; } if (eventTypeString == "SCHEMA_CHANGE") { HandleSchemaChange(frame); return; } var ex = new DriverInternalError("Unknown Event Type"); _logger.Error(ex); throw ex; }
private void OnConnectionCassandraEvent(object sender, CassandraEventArgs e) { //This event is invoked from a worker thread (not a IO thread) if (e is TopologyChangeEventArgs) { var tce = (TopologyChangeEventArgs)e; if (tce.What == TopologyChangeEventArgs.Reason.NewNode || tce.What == TopologyChangeEventArgs.Reason.RemovedNode) { Refresh(); return; } } if (e is StatusChangeEventArgs) { var sce = (StatusChangeEventArgs)e; //The address in the Cassandra event message needs to be translated var address = TranslateAddress(sce.Address); _logger.Info("Received Node status change event: host {0} is {1}", address, sce.What.ToString().ToUpper()); if (sce.What == StatusChangeEventArgs.Reason.Up) { Metadata.BringUpHost(address, this); return; } if (sce.What == StatusChangeEventArgs.Reason.Down) { Metadata.SetDownHost(address, this); return; } } if (e is SchemaChangeEventArgs) { var ssc = (SchemaChangeEventArgs)e; if (!String.IsNullOrEmpty(ssc.Table)) { Metadata.RefreshTable(ssc.Keyspace, ssc.Table); return; } if (ssc.FunctionName != null) { Metadata.ClearFunction(ssc.Keyspace, ssc.FunctionName, ssc.Signature); return; } if (ssc.AggregateName != null) { Metadata.ClearAggregate(ssc.Keyspace, ssc.AggregateName, ssc.Signature); return; } if (ssc.Type != null) { return; } if (ssc.What == SchemaChangeEventArgs.Reason.Dropped) { Metadata.RemoveKeyspace(ssc.Keyspace); return; } Metadata.RefreshSingleKeyspace(ssc.What == SchemaChangeEventArgs.Reason.Created, ssc.Keyspace); } }
private void conn_CassandraEvent(object sender, CassandraEventArgs e) { if (e is TopologyChangeEventArgs) { var tce = e as TopologyChangeEventArgs; if (tce.What == TopologyChangeEventArgs.Reason.NewNode) { SetupControlConnection(true); _cluster.Metadata.AddHost(tce.Address); return; } else if (tce.What == TopologyChangeEventArgs.Reason.RemovedNode) { _cluster.Metadata.RemoveHost(tce.Address); SetupControlConnection(!tce.Address.Equals(listeningOnHost)); return; } } else if (e is StatusChangeEventArgs) { var sce = e as StatusChangeEventArgs; if (sce.What == StatusChangeEventArgs.Reason.Up) { _cluster.Metadata.BringUpHost(sce.Address, this); return; } else if (sce.What == StatusChangeEventArgs.Reason.Down) { _cluster.Metadata.SetDownHost(sce.Address, this); return; } } else if (e is SchemaChangeEventArgs) { var ssc = e as SchemaChangeEventArgs; if (ssc.What == SchemaChangeEventArgs.Reason.Created) { SubmitSchemaRefresh(string.IsNullOrEmpty(ssc.Keyspace) ? null : ssc.Keyspace, null); return; } else if (ssc.What == SchemaChangeEventArgs.Reason.Dropped) { SubmitSchemaRefresh(string.IsNullOrEmpty(ssc.Keyspace) ? null : ssc.Keyspace, null); return; } else if (ssc.What == SchemaChangeEventArgs.Reason.Updated) { SubmitSchemaRefresh(ssc.Keyspace, string.IsNullOrEmpty(ssc.Table) ? null : ssc.Table); return; } } var ex = new DriverInternalError("Unknown Event"); _logger.Error(ex); throw ex; }
public void HandleSchemaChange(Frame frame) { var ce = new SchemaChangeEventArgs(); CassandraEventArgs = ce; var changeTypeText = Reader.ReadString(); SchemaChangeEventArgs.Reason changeType; switch (changeTypeText) { case "UPDATED": changeType = SchemaChangeEventArgs.Reason.Updated; break; case "DROPPED": changeType = SchemaChangeEventArgs.Reason.Dropped; break; default: changeType = SchemaChangeEventArgs.Reason.Created; break; } ce.What = changeType; if (frame.Header.Version < 3) { //protocol v1 and v2: <change_type><keyspace><table> ce.Keyspace = Reader.ReadString(); ce.Table = Reader.ReadString(); return; } //protocol v3+: <change_type><target><options> var target = Reader.ReadString(); ce.Keyspace = Reader.ReadString(); switch (target) { case "TABLE": ce.Table = Reader.ReadString(); break; case "TYPE": ce.Type = Reader.ReadString(); break; case "FUNCTION": ce.FunctionName = Reader.ReadString(); ce.Signature = Reader.ReadStringList(); break; case "AGGREGATE": ce.AggregateName = Reader.ReadString(); ce.Signature = Reader.ReadStringList(); break; } }
private void OnConnectionCassandraEvent(object sender, CassandraEventArgs e) { Task.Factory.StartNew(() => { if (e is TopologyChangeEventArgs) { var tce = (TopologyChangeEventArgs)e; if (tce.What == TopologyChangeEventArgs.Reason.NewNode) { Refresh(false); return; } if (tce.What == TopologyChangeEventArgs.Reason.RemovedNode) { Refresh(false); return; } } if (e is StatusChangeEventArgs) { var sce = (StatusChangeEventArgs)e; //The address in the Cassandra event message needs to be translated var address = TranslateAddress(sce.Address); if (sce.What == StatusChangeEventArgs.Reason.Up) { Metadata.BringUpHost(address, this); return; } if (sce.What == StatusChangeEventArgs.Reason.Down) { Metadata.SetDownHost(address, this); return; } } if (e is SchemaChangeEventArgs) { var ssc = (SchemaChangeEventArgs)e; if (!String.IsNullOrEmpty(ssc.Table)) { Metadata.RefreshTable(ssc.Keyspace, ssc.Table); return; } if (ssc.What == SchemaChangeEventArgs.Reason.Dropped) { Metadata.RemoveKeyspace(ssc.Keyspace); return; } Metadata.RefreshSingleKeyspace(ssc.What == SchemaChangeEventArgs.Reason.Created, ssc.Keyspace); } }, CancellationToken.None, TaskCreationOptions.None, TaskScheduler.Default); }
private void OnConnectionCassandraEvent(object sender, CassandraEventArgs e) { //This event is invoked from a worker thread (not a IO thread) if (e is TopologyChangeEventArgs) { var tce = (TopologyChangeEventArgs)e; if (tce.What == TopologyChangeEventArgs.Reason.NewNode || tce.What == TopologyChangeEventArgs.Reason.RemovedNode) { // Start refresh Refresh().Forget(); return; } } if (e is StatusChangeEventArgs) { HandleStatusChangeEvent((StatusChangeEventArgs)e); return; } if (e is SchemaChangeEventArgs) { var ssc = (SchemaChangeEventArgs)e; if (!string.IsNullOrEmpty(ssc.Table)) { //Can be either a table or a view _metadata.RefreshTable(ssc.Keyspace, ssc.Table); _metadata.RefreshView(ssc.Keyspace, ssc.Table); return; } if (ssc.FunctionName != null) { _metadata.ClearFunction(ssc.Keyspace, ssc.FunctionName, ssc.Signature); return; } if (ssc.AggregateName != null) { _metadata.ClearAggregate(ssc.Keyspace, ssc.AggregateName, ssc.Signature); return; } if (ssc.Type != null) { return; } if (ssc.What == SchemaChangeEventArgs.Reason.Dropped) { _metadata.RemoveKeyspace(ssc.Keyspace); return; } _metadata.RefreshSingleKeyspace(ssc.What == SchemaChangeEventArgs.Reason.Created, ssc.Keyspace); } }
public void RegisterForEvents() { var eventHandle = new AutoResetEvent(false); CassandraEventArgs eventArgs = null; using (var connection = CreateConnection()) { connection.Init(); var eventTypes = CassandraEventType.TopologyChange | CassandraEventType.StatusChange | CassandraEventType.SchemaChange; var task = connection.Send(new RegisterForEventRequest(connection.ProtocolVersion, eventTypes)); TaskHelper.WaitToComplete(task, 1000); Assert.IsInstanceOf <ReadyResponse>(task.Result); connection.CassandraEventResponse += (o, e) => { eventArgs = e; eventHandle.Set(); }; //create a keyspace and check if gets received as an event Query(connection, String.Format(TestUtils.CREATE_KEYSPACE_SIMPLE_FORMAT, "test_events_kp", 1)).Wait(1000); eventHandle.WaitOne(2000); Assert.IsNotNull(eventArgs); Assert.IsInstanceOf <SchemaChangeEventArgs>(eventArgs); Assert.AreEqual(SchemaChangeEventArgs.Reason.Created, (eventArgs as SchemaChangeEventArgs).What); Assert.AreEqual("test_events_kp", (eventArgs as SchemaChangeEventArgs).Keyspace); Assert.IsNullOrEmpty((eventArgs as SchemaChangeEventArgs).Table); //create a table and check if gets received as an event Query(connection, String.Format(TestUtils.CREATE_TABLE_ALL_TYPES, "test_events_kp.test_table", 1)).Wait(1000); eventHandle.WaitOne(2000); Assert.IsNotNull(eventArgs); Assert.IsInstanceOf <SchemaChangeEventArgs>(eventArgs); Assert.AreEqual(SchemaChangeEventArgs.Reason.Created, (eventArgs as SchemaChangeEventArgs).What); Assert.AreEqual("test_events_kp", (eventArgs as SchemaChangeEventArgs).Keyspace); Assert.AreEqual("test_table", (eventArgs as SchemaChangeEventArgs).Table); if (connection.ProtocolVersion >= 3) { //create a udt type Query(connection, "CREATE TYPE test_events_kp.test_type (street text, city text, zip int);").Wait(1000); eventHandle.WaitOne(2000); Assert.IsNotNull(eventArgs); Assert.IsInstanceOf <SchemaChangeEventArgs>(eventArgs); Assert.AreEqual(SchemaChangeEventArgs.Reason.Created, (eventArgs as SchemaChangeEventArgs).What); Assert.AreEqual("test_events_kp", (eventArgs as SchemaChangeEventArgs).Keyspace); Assert.AreEqual("test_type", (eventArgs as SchemaChangeEventArgs).Type); } } }
public void Register_For_Events() { var eventHandle = new AutoResetEvent(false); CassandraEventArgs eventArgs = null; using (var connection = CreateConnection()) { connection.Open().Wait(); Query(connection, String.Format("DROP KEYSPACE IF EXISTS test_events_kp", 1)).Wait(); var eventTypes = CassandraEventType.TopologyChange | CassandraEventType.StatusChange | CassandraEventType.SchemaChange; var task = connection.Send(new RegisterForEventRequest(eventTypes)); TaskHelper.WaitToComplete(task, 1000); Assert.IsInstanceOf <ReadyResponse>(task.Result); connection.CassandraEventResponse += (o, e) => { eventArgs = e; eventHandle.Set(); }; //create a keyspace and check if gets received as an event Query(connection, String.Format(TestUtils.CreateKeyspaceSimpleFormat, "test_events_kp", 1)).Wait(1000); eventHandle.WaitOne(2000); Assert.IsNotNull(eventArgs); Assert.IsInstanceOf <SchemaChangeEventArgs>(eventArgs); Assert.AreEqual(SchemaChangeEventArgs.Reason.Created, (eventArgs as SchemaChangeEventArgs).What); Assert.AreEqual("test_events_kp", (eventArgs as SchemaChangeEventArgs).Keyspace); Assert.That((eventArgs as SchemaChangeEventArgs).Table, Is.Null.Or.Empty); //create a table and check if gets received as an event Query(connection, String.Format(TestUtils.CreateTableAllTypes, "test_events_kp.test_table", 1)).Wait(1000); eventHandle.WaitOne(2000); Assert.IsNotNull(eventArgs); Assert.IsInstanceOf <SchemaChangeEventArgs>(eventArgs); Assert.AreEqual(SchemaChangeEventArgs.Reason.Created, (eventArgs as SchemaChangeEventArgs).What); Assert.AreEqual("test_events_kp", (eventArgs as SchemaChangeEventArgs).Keyspace); Assert.AreEqual("test_table", (eventArgs as SchemaChangeEventArgs).Table); if (CassandraVersion >= Version.Parse("2.1")) { Query(connection, "CREATE TYPE test_events_kp.test_type (street text, city text, zip int);").Wait(1000); eventHandle.WaitOne(2000); Assert.IsNotNull(eventArgs); Assert.IsInstanceOf <SchemaChangeEventArgs>(eventArgs); Assert.AreEqual(SchemaChangeEventArgs.Reason.Created, (eventArgs as SchemaChangeEventArgs).What); Assert.AreEqual("test_events_kp", (eventArgs as SchemaChangeEventArgs).Keyspace); Assert.AreEqual("test_type", (eventArgs as SchemaChangeEventArgs).Type); } } }
public void HandleSchemaChange(Frame frame) { var ce = new SchemaChangeEventArgs(); CassandraEventArgs = ce; var changeTypeText = Reader.ReadString(); SchemaChangeEventArgs.Reason changeType; switch (changeTypeText) { case "UPDATED": changeType = SchemaChangeEventArgs.Reason.Updated; break; case "DROPPED": changeType = SchemaChangeEventArgs.Reason.Dropped; break; default: changeType = SchemaChangeEventArgs.Reason.Created; break; } ce.What = changeType; if (frame.Header.Version < 3) { //protocol v1 and v2: <change_type><keyspace><table> ce.Keyspace = Reader.ReadString(); ce.Table = Reader.ReadString(); return; } //protocol v3+: <change_type><target><options> var target = Reader.ReadString(); ce.Keyspace = Reader.ReadString(); switch (target) { case "TABLE": ce.Table = Reader.ReadString(); break; case "TYPE": ce.Type = Reader.ReadString(); break; case "FUNCTION": ce.FunctionName = Reader.ReadString(); ce.Signature = Reader.ReadStringList(); break; case "AGGREGATE": ce.AggregateName = Reader.ReadString(); ce.Signature = Reader.ReadStringList(); break; } }
internal EventResponse(ResponseFrame frame) : base(frame) { var eventTypeString = BEBinaryReader.ReadString(); if (eventTypeString == "TOPOLOGY_CHANGE") { var ce = new TopologyChangeEventArgs(); ce.What = BEBinaryReader.ReadString() == "NEW_NODE" ? TopologyChangeEventArgs.Reason.NewNode : TopologyChangeEventArgs.Reason.RemovedNode; ce.Address = BEBinaryReader.ReadInet().Address; CassandraEventArgs = ce; return; } else if (eventTypeString == "STATUS_CHANGE") { var ce = new StatusChangeEventArgs(); ce.What = BEBinaryReader.ReadString() == "UP" ? StatusChangeEventArgs.Reason.Up : StatusChangeEventArgs.Reason.Down; ce.Address = BEBinaryReader.ReadInet().Address; CassandraEventArgs = ce; return; } else if (eventTypeString == "SCHEMA_CHANGE") { var ce = new SchemaChangeEventArgs(); var m = BEBinaryReader.ReadString(); ce.What = m == "CREATED" ? SchemaChangeEventArgs.Reason.Created : (m == "UPDATED" ? SchemaChangeEventArgs.Reason.Updated : SchemaChangeEventArgs.Reason.Dropped); ce.Keyspace = BEBinaryReader.ReadString(); ce.Table = BEBinaryReader.ReadString(); CassandraEventArgs = ce; return; } var ex = new DriverInternalError("Unknown Event Type"); _logger.Error(ex); throw ex; }
internal EventResponse(ResponseFrame frame) : base(frame) { var eventTypeString = BEBinaryReader.ReadString(); if (eventTypeString == "TOPOLOGY_CHANGE") { var ce = new TopopogyChangeEventArgs(); ce.What = BEBinaryReader.ReadString() == "NEW_NODE" ? TopopogyChangeEventArgs.Reason.NewNode : TopopogyChangeEventArgs.Reason.RemovedNode; ce.Address = BEBinaryReader.ReadInet().Address; CassandraEventArgs = ce; return; } else if (eventTypeString == "STATUS_CHANGE") { var ce = new StatusChangeEventArgs(); ce.What = BEBinaryReader.ReadString() == "UP" ? StatusChangeEventArgs.Reason.Up : StatusChangeEventArgs.Reason.Down; ce.Address = BEBinaryReader.ReadInet().Address; CassandraEventArgs = ce; return; } else if (eventTypeString == "SCHEMA_CHANGE") { var ce = new SchemaChangeEventArgs(); var m = BEBinaryReader.ReadString(); ce.What = m == "CREATED" ? SchemaChangeEventArgs.Reason.Created : (m == "UPDATED" ? SchemaChangeEventArgs.Reason.Updated : SchemaChangeEventArgs.Reason.Dropped); ce.Keyspace = BEBinaryReader.ReadString(); ce.Table = BEBinaryReader.ReadString(); CassandraEventArgs = ce; return; } var ex = new DriverInternalError("Unknown Event Type"); _logger.Error(ex); throw ex; }
public void HandleSchemaChange(ResponseFrame frame) { var ce = new SchemaChangeEventArgs(); string m = BeBinaryReader.ReadString(); ce.What = m == "CREATED" ? SchemaChangeEventArgs.Reason.Created : (m == "UPDATED" ? SchemaChangeEventArgs.Reason.Updated : SchemaChangeEventArgs.Reason.Dropped); if (frame.Header.Version < 3) { //protocol v1 and v2: <change_type><keyspace><table> ce.Keyspace = BeBinaryReader.ReadString(); ce.Table = BeBinaryReader.ReadString(); } else { //protocol v3: <change_type><target><options> var target = BeBinaryReader.ReadString(); switch (target) { case "KEYSPACE": ce.Keyspace = BeBinaryReader.ReadString(); break; case "TABLE": ce.Keyspace = BeBinaryReader.ReadString(); ce.Table = BeBinaryReader.ReadString(); break; case "TYPE": ce.Keyspace = BeBinaryReader.ReadString(); ce.Type = BeBinaryReader.ReadString(); break; } } CassandraEventArgs = ce; }
internal EventResponse(ResponseFrame frame) : base(frame) { string eventTypeString = BeBinaryReader.ReadString(); if (eventTypeString == "TOPOLOGY_CHANGE") { var ce = new TopologyChangeEventArgs(); ce.What = BeBinaryReader.ReadString() == "NEW_NODE" ? TopologyChangeEventArgs.Reason.NewNode : TopologyChangeEventArgs.Reason.RemovedNode; ce.Address = BeBinaryReader.ReadInet().Address; CassandraEventArgs = ce; return; } if (eventTypeString == "STATUS_CHANGE") { var ce = new StatusChangeEventArgs(); ce.What = BeBinaryReader.ReadString() == "UP" ? StatusChangeEventArgs.Reason.Up : StatusChangeEventArgs.Reason.Down; ce.Address = BeBinaryReader.ReadInet().Address; CassandraEventArgs = ce; return; } if (eventTypeString == "SCHEMA_CHANGE") { HandleSchemaChange(frame); return; } var ex = new DriverInternalError("Unknown Event Type"); _logger.Error(ex); throw ex; }
private void conn_CassandraEvent(object sender, CassandraEventArgs e) { if (e is TopologyChangeEventArgs) { var tce = e as TopologyChangeEventArgs; if (tce.What == TopologyChangeEventArgs.Reason.NewNode) { if (CCEvent != null) CCEvent.Invoke(this, new CCEventArgs() {IPAddress = tce.Address, What = CCEventArgs.Kind.Add}); CheckConnectionUp(tce.Address); return; } else if (tce.What == TopologyChangeEventArgs.Reason.RemovedNode) { if (CCEvent != null) CCEvent.Invoke(this, new CCEventArgs() { IPAddress = tce.Address, What = CCEventArgs.Kind.Remove }); CheckConnectionDown(tce.Address); return; } } else if (e is StatusChangeEventArgs) { var sce = e as StatusChangeEventArgs; if (sce.What == StatusChangeEventArgs.Reason.Up) { if (CCEvent != null) CCEvent.Invoke(this, new CCEventArgs() { IPAddress = sce.Address, What = CCEventArgs.Kind.Add }); CheckConnectionUp(sce.Address); return; } else if (sce.What == StatusChangeEventArgs.Reason.Down) { if (CCEvent != null) CCEvent.Invoke(this, new CCEventArgs() { IPAddress = sce.Address, What = CCEventArgs.Kind.Down }); CheckConnectionDown(sce.Address); return; } } else if (e is SchemaChangeEventArgs) { var ssc = e as SchemaChangeEventArgs; if (ssc.What == SchemaChangeEventArgs.Reason.Created) { SubmitSchemaRefresh(string.IsNullOrEmpty(ssc.Keyspace) ? null : ssc.Keyspace, null); return; } else if (ssc.What == SchemaChangeEventArgs.Reason.Dropped) { SubmitSchemaRefresh(string.IsNullOrEmpty(ssc.Keyspace) ? null : ssc.Keyspace, null); return; } else if (ssc.What == SchemaChangeEventArgs.Reason.Updated) { SubmitSchemaRefresh(ssc.Keyspace, string.IsNullOrEmpty(ssc.Table) ? null : ssc.Table); return; } } var ex = new DriverInternalError("Unknown Event"); _logger.Error(ex); throw ex; }
private void conn_CassandraEvent(object sender, CassandraEventArgs e) { var act = new Action<object>((_) => { if (e is TopologyChangeEventArgs) { var tce = e as TopologyChangeEventArgs; if (tce.What == TopologyChangeEventArgs.Reason.NewNode) { SetupControlConnection(true); _cluster.Metadata.AddHost(tce.Address); return; } else if (tce.What == TopologyChangeEventArgs.Reason.RemovedNode) { _cluster.Metadata.RemoveHost(tce.Address); SetupControlConnection(_activeConnection.Value == null ? false : !tce.Address.Equals(_activeConnection.Value.GetHostAdress())); return; } } else if (e is StatusChangeEventArgs) { var sce = e as StatusChangeEventArgs; if (sce.What == StatusChangeEventArgs.Reason.Up) { _cluster.Metadata.BringUpHost(sce.Address, this); return; } else if (sce.What == StatusChangeEventArgs.Reason.Down) { _cluster.Metadata.SetDownHost(sce.Address, this); return; } } else if (e is SchemaChangeEventArgs) { var ssc = e as SchemaChangeEventArgs; if (ssc.What == SchemaChangeEventArgs.Reason.Created) { SubmitSchemaRefresh(string.IsNullOrEmpty(ssc.Keyspace) ? null : ssc.Keyspace, null); _cluster.Metadata.FireSchemaChangedEvent(SchemaChangedEventArgs.Kind.Created, string.IsNullOrEmpty(ssc.Keyspace) ? null : ssc.Keyspace, ssc.Table); return; } else if (ssc.What == SchemaChangeEventArgs.Reason.Dropped) { SubmitSchemaRefresh(string.IsNullOrEmpty(ssc.Keyspace) ? null : ssc.Keyspace, null); _cluster.Metadata.FireSchemaChangedEvent(SchemaChangedEventArgs.Kind.Dropped, string.IsNullOrEmpty(ssc.Keyspace) ? null : ssc.Keyspace, ssc.Table); return; } else if (ssc.What == SchemaChangeEventArgs.Reason.Updated) { SubmitSchemaRefresh(ssc.Keyspace, string.IsNullOrEmpty(ssc.Table) ? null : ssc.Table); _cluster.Metadata.FireSchemaChangedEvent(SchemaChangedEventArgs.Kind.Updated, string.IsNullOrEmpty(ssc.Keyspace) ? null : ssc.Keyspace, ssc.Table); return; } } var ex = new DriverInternalError("Unknown Event"); _logger.Error(ex); throw ex; }); act.BeginInvoke(null, (ar) => { act.EndInvoke(ar); }, null); }
private void OnConnectionCassandraEvent(object sender, CassandraEventArgs e) { //This event is invoked from a worker thread (not a IO thread) if (e is TopologyChangeEventArgs) { var tce = (TopologyChangeEventArgs)e; if (tce.What == TopologyChangeEventArgs.Reason.NewNode) { Refresh(false); return; } if (tce.What == TopologyChangeEventArgs.Reason.RemovedNode) { Refresh(false); return; } } if (e is StatusChangeEventArgs) { var sce = (StatusChangeEventArgs)e; //The address in the Cassandra event message needs to be translated var address = TranslateAddress(sce.Address); if (sce.What == StatusChangeEventArgs.Reason.Up) { Metadata.BringUpHost(address, this); return; } if (sce.What == StatusChangeEventArgs.Reason.Down) { Metadata.SetDownHost(address, this); return; } } if (e is SchemaChangeEventArgs) { var ssc = (SchemaChangeEventArgs)e; if (!String.IsNullOrEmpty(ssc.Table)) { Metadata.RefreshTable(ssc.Keyspace, ssc.Table); return; } if (ssc.FunctionName != null) { Metadata.ClearFunction(ssc.Keyspace, ssc.FunctionName, ssc.Signature); return; } if (ssc.AggregateName != null) { Metadata.ClearAggregate(ssc.Keyspace, ssc.AggregateName, ssc.Signature); return; } if (ssc.Type != null) { return; } if (ssc.What == SchemaChangeEventArgs.Reason.Dropped) { Metadata.RemoveKeyspace(ssc.Keyspace); return; } Metadata.RefreshSingleKeyspace(ssc.What == SchemaChangeEventArgs.Reason.Created, ssc.Keyspace); } }
private void conn_CassandraEvent(object sender, CassandraEventArgs e) { var act = new Action <object>((_) => { if (e is TopologyChangeEventArgs) { var tce = e as TopologyChangeEventArgs; if (tce.What == TopologyChangeEventArgs.Reason.NewNode) { SetupControlConnection(true); _cluster.Metadata.AddHost(tce.Address); return; } else if (tce.What == TopologyChangeEventArgs.Reason.RemovedNode) { _cluster.Metadata.RemoveHost(tce.Address); SetupControlConnection(_activeConnection.Value == null ? false : !tce.Address.Equals(_activeConnection.Value.GetHostAdress())); return; } } else if (e is StatusChangeEventArgs) { var sce = e as StatusChangeEventArgs; if (sce.What == StatusChangeEventArgs.Reason.Up) { _cluster.Metadata.BringUpHost(sce.Address, this); return; } else if (sce.What == StatusChangeEventArgs.Reason.Down) { _cluster.Metadata.SetDownHost(sce.Address, this); return; } } else if (e is SchemaChangeEventArgs) { var ssc = e as SchemaChangeEventArgs; if (ssc.What == SchemaChangeEventArgs.Reason.Created) { SubmitSchemaRefresh(string.IsNullOrEmpty(ssc.Keyspace) ? null : ssc.Keyspace, null); return; } else if (ssc.What == SchemaChangeEventArgs.Reason.Dropped) { SubmitSchemaRefresh(string.IsNullOrEmpty(ssc.Keyspace) ? null : ssc.Keyspace, null); return; } else if (ssc.What == SchemaChangeEventArgs.Reason.Updated) { SubmitSchemaRefresh(ssc.Keyspace, string.IsNullOrEmpty(ssc.Table) ? null : ssc.Table); return; } } var ex = new DriverInternalError("Unknown Event"); _logger.Error(ex); throw ex; }); act.BeginInvoke(null, (ar) => { act.EndInvoke(ar); }, null); }
public void HandleSchemaChange(ResponseFrame frame) { var ce = new SchemaChangeEventArgs(); string m = BeBinaryReader.ReadString(); ce.What = m == "CREATED" ? SchemaChangeEventArgs.Reason.Created : (m == "UPDATED" ? SchemaChangeEventArgs.Reason.Updated : SchemaChangeEventArgs.Reason.Dropped); if (frame.Header.Version < 3) { //protocol v1 and v2: <change_type><keyspace><table> ce.Keyspace = BeBinaryReader.ReadString(); ce.Table = BeBinaryReader.ReadString(); } else { //protocol v3: <change_type><target><options> var target = BeBinaryReader.ReadString(); switch (target) { case "KEYSPACE": ce.Keyspace = BeBinaryReader.ReadString(); break; case "TABLE": ce.Keyspace = BeBinaryReader.ReadString(); ce.Table = BeBinaryReader.ReadString(); break; case "TYPE": ce.Keyspace = BeBinaryReader.ReadString(); ce.Type = BeBinaryReader.ReadString(); break; } } CassandraEventArgs = ce; }
private void OnConnectionCassandraEvent(object sender, CassandraEventArgs e) { //This event is invoked from a worker thread (not a IO thread) if (e is TopologyChangeEventArgs) { var tce = (TopologyChangeEventArgs)e; if (tce.What == TopologyChangeEventArgs.Reason.NewNode || tce.What == TopologyChangeEventArgs.Reason.RemovedNode) { Refresh(); return; } } if (e is StatusChangeEventArgs) { var sce = (StatusChangeEventArgs)e; //The address in the Cassandra event message needs to be translated var address = TranslateAddress(sce.Address); _logger.Info("Received Node status change event: host {0} is {1}", address, sce.What.ToString().ToUpper()); if (sce.What == StatusChangeEventArgs.Reason.Up) { _metadata.BringUpHost(address, this); return; } if (sce.What == StatusChangeEventArgs.Reason.Down) { _metadata.SetDownHost(address, this); return; } } if (e is SchemaChangeEventArgs) { var ssc = (SchemaChangeEventArgs)e; if (!string.IsNullOrEmpty(ssc.Table)) { //Can be either a table or a view _metadata.RefreshTable(ssc.Keyspace, ssc.Table); _metadata.RefreshView(ssc.Keyspace, ssc.Table); return; } if (ssc.FunctionName != null) { _metadata.ClearFunction(ssc.Keyspace, ssc.FunctionName, ssc.Signature); return; } if (ssc.AggregateName != null) { _metadata.ClearAggregate(ssc.Keyspace, ssc.AggregateName, ssc.Signature); return; } if (ssc.Type != null) { return; } if (ssc.What == SchemaChangeEventArgs.Reason.Dropped) { _metadata.RemoveKeyspace(ssc.Keyspace); return; } _metadata.RefreshSingleKeyspace(ssc.What == SchemaChangeEventArgs.Reason.Created, ssc.Keyspace); } }
private void OnConnectionCassandraEvent(object sender, CassandraEventArgs e) { Task.Factory.StartNew(() => { if (e is TopologyChangeEventArgs) { var tce = (TopologyChangeEventArgs) e; if (tce.What == TopologyChangeEventArgs.Reason.NewNode) { Refresh(false); return; } if (tce.What == TopologyChangeEventArgs.Reason.RemovedNode) { Refresh(false); return; } } if (e is StatusChangeEventArgs) { var sce = (StatusChangeEventArgs) e; //The address in the Cassandra event message needs to be translated var address = TranslateAddress(sce.Address); if (sce.What == StatusChangeEventArgs.Reason.Up) { Metadata.BringUpHost(address, this); return; } if (sce.What == StatusChangeEventArgs.Reason.Down) { Metadata.SetDownHost(address, this); return; } } if (e is SchemaChangeEventArgs) { var ssc = (SchemaChangeEventArgs) e; if (!String.IsNullOrEmpty(ssc.Table)) { Metadata.RefreshTable(ssc.Keyspace, ssc.Table); return; } if (ssc.What == SchemaChangeEventArgs.Reason.Dropped) { Metadata.RemoveKeyspace(ssc.Keyspace); return; } Metadata.RefreshSingleKeyspace(ssc.What == SchemaChangeEventArgs.Reason.Created, ssc.Keyspace); } }, CancellationToken.None, TaskCreationOptions.None, TaskScheduler.Default); }
private void conn_CassandraEvent(object sender, CassandraEventArgs e) { if (e is TopologyChangeEventArgs) { var tce = e as TopologyChangeEventArgs; if (tce.What == TopologyChangeEventArgs.Reason.NewNode) { SetupControlConnection(true); _cluster.Metadata.AddHost(tce.Address); return; } else if (tce.What == TopologyChangeEventArgs.Reason.RemovedNode) { _cluster.Metadata.RemoveHost(tce.Address); SetupControlConnection(!tce.Address.Equals(listeningOnHost)); return; } } else if (e is StatusChangeEventArgs) { var sce = e as StatusChangeEventArgs; if (sce.What == StatusChangeEventArgs.Reason.Up) { _cluster.Metadata.BringUpHost(sce.Address, this); return; } else if (sce.What == StatusChangeEventArgs.Reason.Down) { _cluster.Metadata.SetDownHost(sce.Address, this); return; } } else if (e is SchemaChangeEventArgs) { var ssc = e as SchemaChangeEventArgs; if (ssc.What == SchemaChangeEventArgs.Reason.Created) { SubmitSchemaRefresh(string.IsNullOrEmpty(ssc.Keyspace) ? null : ssc.Keyspace, null); return; } else if (ssc.What == SchemaChangeEventArgs.Reason.Dropped) { SubmitSchemaRefresh(string.IsNullOrEmpty(ssc.Keyspace) ? null : ssc.Keyspace, null); return; } else if (ssc.What == SchemaChangeEventArgs.Reason.Updated) { SubmitSchemaRefresh(ssc.Keyspace, string.IsNullOrEmpty(ssc.Table) ? null : ssc.Table); return; } } var ex = new DriverInternalError("Unknown Event"); _logger.Error(ex); throw ex; }