func (srv *ServerNode) loadTopic(dataPath string, topic ConfigTopic) (*Node, error) { topicPath := path.Join(dataPath, topic.Name) dataLog := &commitlog.CommitLog{} topicStore := disklog.NewDiskTopicPersistentStore(topicPath) dataStore, err := disklog.LoadLog(topic.Name, topicPath, disklog.SetTargetSegmentSize(topic.SegmentSize), disklog.SetSegmentCleanupAge(topic.SegmentCleanupAge)) if err != nil { srv_log("Error loading disk log: %v\n", err) return nil, err } err = dataLog.SetupLog(topic.Name, dataStore) if err != nil { srv_log("Error setting up log: %v\n", err) return nil, err } node := &Node{} var peerConfigToUse ConfigPeers if srv.config.Peers.Contains(srv.address) { peerConfigToUse = srv.config.Peers } else { peerConfigToUse = make(ConfigPeers, 0) } err = node.SetupNode(topic.Name, srv, srv.address, peerConfigToUse, dataLog, topicStore) if err != nil { srv_log("Error starting node, stopping.") return nil, err } // Adding this topic srv.lock.Lock() srv.topics[topic.Name] = node // Update the sorted list of topic names srv.updateTopicNameListHoldingLock() srv.lock.Unlock() srv_log("Topic %v loaded and ready to serve\n", topic.Name) return node, nil }
func (srv *ServerNode) manageConfigurationChanges() { srv_log("Waiting for configuration requests to handle\n") for request := range srv.changeConfig { srv_log("Processing new configuration change request\n") newConfig := request.Configuration if newConfig.Cluster_ID == srv.config.Cluster_ID { var err error srv_log("Recieved new configuration") if newConfig.Scope&CNF_Set_Peers != 0 { srv_log("Change in peers configuration") srv.config.Peers = newConfig.Peers srv.setPeers(newConfig.Peers) var peerConfigToUse ConfigPeers // Use the new configuration for topics only if we are part of the cluster. if newConfig.Peers.Contains(srv.address) { peerConfigToUse = newConfig.Peers } else { peerConfigToUse = make(ConfigPeers, 0) } srv_log("Passing new peer configuration to topics.\n") for _, topic := range srv.topics { topic.ChangePeerConfiguration(peerConfigToUse) } } else if newConfig.Scope&CNF_Set_Topic != 0 { srv_log("Topic configuration") for _, newTopic := range newConfig.Topics { if !srv.config.Topics.Contains(newTopic.Name) { topicConfig := GetDefaultTopicConfiguration() topicConfig.Name = newTopic.Name if newTopic.SegmentSize > 0 { topicConfig.SegmentSize = newTopic.SegmentSize } srv.config.Topics[newTopic.Name] = topicConfig node, err := srv.createTopic(topicConfig) node.StartNode() if err != nil { break } } else { // Modification of existing topic. configChangesToApply := make([]disklog.DiskLogConfigFunction, 0, 3) currentTopic := srv.config.Topics[newTopic.Name] if newTopic.SegmentSize > 0 && currentTopic.SegmentSize != newTopic.SegmentSize { // Change the current configuration currentTopic.SegmentSize = newTopic.SegmentSize configChangesToApply = append(configChangesToApply, disklog.SetTargetSegmentSize(newTopic.SegmentSize)) } if newTopic.SegmentCleanupAge >= 0 && currentTopic.SegmentCleanupAge != newTopic.SegmentCleanupAge { // Change the current configuration currentTopic.SegmentCleanupAge = newTopic.SegmentCleanupAge configChangesToApply = append(configChangesToApply, disklog.SetSegmentCleanupAge(newTopic.SegmentCleanupAge)) } if len(configChangesToApply) > 0 { // Store any changes we've made srv.config.Topics[newTopic.Name] = currentTopic // Update the current configuration. srv.lock.RLock() node := srv.topics[newTopic.Name] diskStorage := node.GetCommitLog().GetLogStorage().(*disklog.DiskLogStorage) diskStorage.ChangeConfiguration(configChangesToApply...) srv.lock.RUnlock() } } } } else if newConfig.Scope&CNF_Remove_Topic != 0 { srv_log("Topic removal") for _, removedTopic := range newConfig.Topics { if srv.config.Topics.Contains(removedTopic.Name) { currentTopic := srv.config.Topics[removedTopic.Name] delete(srv.config.Topics, removedTopic.Name) err = srv.removeTopic(currentTopic) if err != nil { break } } else { srv_log("Topic %v not present - no removal required.\n", removedTopic.Name) } } } if err == nil { srv_log("Saving configuration\n") err = srv.config.SaveConfiguration() } if err != nil { request.Response <- rapi.Get_RI_INTERNAL_ERROR(srv.address, err.Error()) } else { request.Response <- rapi.Get_RI_SUCCESS() } } else { srv_log("Cluster ID give for config change (%v) doesn't match server cluster ID of (%v)\n", newConfig.Cluster_ID, srv.config.Cluster_ID) request.Response <- rapi.Get_RI_MISMATCHED_CLUSTER_ID(srv.address, newConfig.Cluster_ID, srv.config.Cluster_ID) } } srv_log("manageConfigurationChanges shutdown\n") }