Beispiel #1
0
        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;
        }
Beispiel #2
0
 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;
            }
        }
Beispiel #5
0
 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;
     }
 }
Beispiel #10
0
        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;
        }
Beispiel #11
0
        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;
        }
Beispiel #12
0
        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;
        }
Beispiel #13
0
        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);
        }
Beispiel #18
0
 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;
        }