public PartitionParser(Connection conn, Node node, Dictionary<string, Node[][]> map, int partitionCount, bool requestProleReplicas)
        {
            // Send format 1:  partition-generation\nreplicas-master\n
            // Send format 2:  partition-generation\nreplicas-all\n
            this.partitionCount = partitionCount;
            this.map = map;

            string command = (requestProleReplicas) ? ReplicasAll : ReplicasMaster;
            Info info = new Info(conn, PartitionGeneration, command);
            this.length = info.GetLength();

            if (length == 0)
            {
                throw new AerospikeException.Parse("Partition info is empty");
            }
            this.buffer = info.GetBuffer();

            generation = ParseGeneration();

            if (requestProleReplicas)
            {
                ParseReplicasAll(node);
            }
            else
            {
                ParseReplicasMaster(node);
            }
        }
 public BatchNode(Node node, int capacity, int offset)
 {
     this.node = node;
     this.offsets = new int[capacity];
     this.offsets[0] = offset;
     this.offsetsSize = 1;
 }
 private void GetNamespaceConfig(Node node)
 {
     string filter = "namespace/" + args.ns;
     string tokens = Info.Request(null, node, filter);
     Assert.IsNotNull(tokens);
     LogNameValueTokens(tokens);
 }
 public QueryRecordCommand(Node node, Policy policy, Statement statement, RecordSet recordSet)
     : base(node, true)
 {
     this.policy = policy;
     this.statement = statement;
     this.recordSet = recordSet;
 }
        public BatchNode(Node node, Key[] keys)
        {
            this.node = node;
            this.offsets = new int[keys.Length];
            this.offsetsSize = keys.Length;

            for (int i = 0; i < offsetsSize; i++)
            {
                offsets[i] = i;
            }
        }
        public QueryAggregateCommand(
			Node node,
			Policy policy,
			Statement statement,
			BlockingCollection<object> inputQueue,
			CancellationToken cancelToken
		)
            : base(node, true)
        {
            this.policy = policy;
            this.statement = statement;
            this.inputQueue = inputQueue;
            this.cancelToken = cancelToken;
        }
        /// <summary>
        /// Query namespace configuration.
        /// </summary>
        private void GetNamespaceConfig(Node node, Arguments args)
        {
            console.Write("Namespace Configuration");
            string filter = "namespace/" + args.ns;
            string tokens = Info.Request(node, filter);

            if (tokens == null)
            {
                throw new Exception(string.Format("Failed to get namespace info: host={0} namespace={1}",
                    node, args.ns));
            }

            LogNameValueTokens(tokens);
        }
        public ScanCommand(
			Node node, 
			ScanPolicy policy,
			string ns,
			string setName,
			ScanCallback callback,
			string[] binNames,
			long taskId
		)
            : base(node, true)
        {
            this.policy = policy;
            this.ns = ns;
            this.setName = setName;
            this.callback = callback;
            this.binNames = binNames;
            this.taskId = taskId;
        }
        private void GetServerConfig(Node node)
        {
            IDictionary<string, string> map = Info.Request(null, node);
            Assert.IsNotNull(map);

            foreach (KeyValuePair<string, string> entry in map)
            {
                string key = entry.Key;

                if (key.Equals("statistics") || key.Equals("query-stat"))
                {
                    LogNameValueTokens(entry.Value);
                }
                else
                {
                    if (!(key.Equals("services-alumni") || key.Equals("services")))
                    {
                        Assert.IsNotNull(entry.Value);
                    }
                }
            }
        }
        /// <summary>
        /// Query server configuration and cluster status.
        /// </summary>
        private void GetServerConfig(Node node, Arguments args)
        {
            console.Write("Server Configuration");
            Dictionary<string, string> map = Info.Request(null, node);

            if (map == null)
            {
                throw new Exception("Failed to get server info: host=" + node);
            }

            foreach (KeyValuePair<string, string> entry in map)
            {
                string key = entry.Key;

                if (key.Equals("statistics") || key.Equals("query-stat"))
                {
                    LogNameValueTokens(entry.Value);
                }
                else
                {
                    console.Write(key + '=' + entry.Value);
                }
            }
        }
        /// <summary>
        /// Remove nodes using copy on write semantics.
        /// </summary>
        private void RemoveNodesCopy(List<Node> nodesToRemove)
        {
            // Create temporary nodes array.
            // Since nodes are only marked for deletion using node references in the nodes array,
            // and the tend thread is the only thread modifying nodes, we are guaranteed that nodes
            // in nodesToRemove exist.  Therefore, we know the final array size.
            Node[] nodeArray = new Node[nodes.Length - nodesToRemove.Count];
            int count = 0;

            // Add nodes that are not in remove list.
            foreach (Node node in nodes)
            {
                if (FindNode(node, nodesToRemove))
                {
                    if (tendValid && Log.InfoEnabled())
                    {
                        Log.Info("Remove node " + node);
                    }
                }
                else
                {
                    nodeArray[count++] = node;
                }
            }

            // Do sanity check to make sure assumptions are correct.
            if (count < nodeArray.Length)
            {
                if (Log.WarnEnabled())
                {
                    Log.Warn("Node remove mismatch. Expected " + nodeArray.Length + " Received " + count);
                }
                // Resize array.
                Node[] nodeArray2 = new Node[count];
                Array.Copy(nodeArray, 0, nodeArray2, 0, count);
                nodeArray = nodeArray2;
            }

            // Replace nodes with copy.
            nodes = nodeArray;
        }
 protected internal override MultiCommand CreateCommand(Node node)
 {
     return new QueryAggregateCommand(node, policy, statement, inputQueue, cancel.Token);
 }
        /// <summary>
        /// Add nodes using copy on write semantics.
        /// </summary>
        private void AddNodesCopy(List<Node> nodesToAdd)
        {
            // Create temporary nodes array.
            Node[] nodeArray = new Node[nodes.Length + nodesToAdd.Count];
            int count = 0;

            // Add existing nodes.
            foreach (Node node in nodes)
            {
                nodeArray[count++] = node;
            }

            // Add new nodes
            foreach (Node node in nodesToAdd)
            {
                if (Log.InfoEnabled())
                {
                    Log.Info("Add node " + node);
                }
                nodeArray[count++] = node;
            }

            // Replace nodes with copy.
            nodes = nodeArray;
        }
 private bool FindNodeInPartitionMap(Node filter)
 {
     foreach (Node[][] replicaArray in partitionMap.Values)
     {
         foreach (Node[] nodeArray in replicaArray)
         {
             foreach (Node node in nodeArray)
             {
                 // Use reference equality for performance.
                 if (node == filter)
                 {
                     return true;
                 }
             }
         }
     }
     return false;
 }
 private static bool FindNode(Node search, List<Node> nodeList)
 {
     foreach (Node node in nodeList)
     {
         if (node.Equals(search))
         {
             return true;
         }
     }
     return false;
 }
 private void AddAliases(Node node)
 {
     // Add node's aliases to global alias set.
     // Aliases are only used in tend thread, so synchronization is not necessary.
     foreach (Host alias in node.Aliases)
     {
         aliases[alias] = node;
     }
 }
        /// <summary>
        /// Get default info values from the specified database server node.
        /// This method supports user authentication.
        /// </summary>
        /// <param name="policy">info command configuration parameters, pass in null for defaults</param>
        /// <param name="node">server node</param>
        public static Dictionary<string, string> Request(InfoPolicy policy, Node node)
        {
            int timeout = (policy == null) ? DEFAULT_TIMEOUT : policy.timeout;
            Connection conn = node.GetConnection(timeout);

            try
            {
                Dictionary<string, string> result = Request(conn);
                node.PutConnection(conn);
                return result;
            }
            catch (Exception)
            {
                // Garbage may be in socket.  Do not put back into pool.
                node.CloseConnection(conn);
                throw;
            }
        }
Exemple #18
0
 protected internal override QueryCommand CreateCommand(Node node)
 {
     return(new QueryAggregateCommand(node, policy, statement, inputQueue, cancel.Token));
 }
 /// <summary>
 /// Create timeout exception with statistics.
 /// </summary>
 public Timeout(Node node, int timeout, int iterations, int failedNodes, int failedConns)
     : base(ResultCode.TIMEOUT)
 {
     this.node = node;
     this.timeout = timeout;
     this.iterations = iterations;
     this.failedNodes = failedNodes;
     this.failedConns = failedConns;
 }
 protected internal MultiCommand(Node node, bool stopOnNotFound)
 {
     this.node = node;
     this.stopOnNotFound = stopOnNotFound;
 }
        public BatchGetArrayDirect(
			Node node,
			BatchNode.BatchNamespace batch,
			Policy policy,
			Key[] keys,
			string[] binNames,
			Record[] records,
			int readAttr
		)
            : base(node, false)
        {
            this.batch = batch;
            this.policy = policy;
            this.keys = keys;
            this.binNames = binNames;
            this.records = records;
            this.readAttr = readAttr;
        }
        public BatchExistsArrayDirect(
			Node node,
			BatchNode.BatchNamespace batch,
			Policy policy,
			Key[] keys,
			bool[] existsArray
		)
            : base(node, false)
        {
            this.batch = batch;
            this.policy = policy;
            this.keys = keys;
            this.existsArray = existsArray;
        }
 protected internal abstract MultiCommand CreateCommand(Node node);
        private void DecodeBitmap(Node node, Node[] nodeArray, int begin)
        {
            char[] chars = Encoding.ASCII.GetChars(buffer, begin, offset - begin);
            byte[] restoreBuffer = Convert.FromBase64CharArray(chars, 0, chars.Length);

            for (int i = 0; i < partitionCount; i++)
            {
                Node nodeOld = nodeArray[i];

                if ((restoreBuffer[i >> 3] & (0x80 >> (i & 7))) != 0)
                {
                    // Node owns this partition.
                    // Log.info("Map: " + i);
                    if (nodeOld != null && nodeOld != node)
                    {
                        // Force previously mapped node to refresh it's partition map on next cluster tend.
                        nodeOld.partitionGeneration = -1;
                    }
                    nodeArray[i] = node;
                }
                else
                {
                    // Node does not own partition.
                    if (node == nodeOld)
                    {
                        // Must erase previous map.
                        nodeArray[i] = null;
                    }
                }
            }
        }
        private void ParseReplicasAll(Node node)
        {
            // Use low-level info methods and parse byte array directly for maximum performance.
            // Receive format: replicas-all\t
            //                 <ns1>:<count>,<base 64 encoded bitmap1>,<base 64 encoded bitmap2>...;
            //                 <ns2>:<count>,<base 64 encoded bitmap1>,<base 64 encoded bitmap2>...;\n
            ExpectName(ReplicasAll);

            int begin = offset;

            while (offset < length)
            {
                if (buffer[offset] == ':')
                {
                    // Parse namespace.
                    string ns = ByteUtil.Utf8ToString(buffer, begin, offset - begin).Trim();

                    if (ns.Length <= 0 || ns.Length >= 32)
                    {
                        string response = GetTruncatedResponse();
                        throw new AerospikeException.Parse("Invalid partition namespace " + ns + ". Response=" + response);
                    }
                    begin = ++offset;

                    // Parse replica count.
                    while (offset < length)
                    {
                        byte b = buffer[offset];

                        if (b == ',')
                        {
                            break;
                        }
                        offset++;
                    }
                    int replicaCount = Convert.ToInt32(Encoding.UTF8.GetString(buffer, begin, offset - begin));

                    // Ensure replicaArray is correct size.
                    Node[][] replicaArray;

                    if (!map.TryGetValue(ns, out replicaArray))
                    {
                        // Create new replica array.
                        replicaArray = new Node[replicaCount][];

                        for (int i = 0; i < replicaCount; i++)
                        {
                            replicaArray[i] = new Node[partitionCount];
                        }

                        CopyPartitionMap();
                        map[ns] = replicaArray;
                    }
                    else if (replicaArray.Length != replicaCount)
                    {
                        if (Log.InfoEnabled())
                        {
                            Log.Info("Namespace " + ns + " replication factor changed from " + replicaArray.Length + " to " + replicaCount);
                        }

                        // Resize replica array.
                        Node[][] replicaTarget = new Node[replicaCount][];

                        if (replicaArray.Length < replicaCount)
                        {
                            int i = 0;

                            // Copy existing entries.
                            for (; i < replicaArray.Length; i++)
                            {
                                replicaTarget[i] = replicaArray[i];
                            }

                            // Create new entries.
                            for (; i < replicaCount; i++)
                            {
                                replicaTarget[i] = new Node[partitionCount];
                            }
                        }
                        else
                        {
                            // Copy existing entries.
                            for (int i = 0; i < replicaCount; i++)
                            {
                                replicaTarget[i] = replicaArray[i];
                            }
                        }

                        CopyPartitionMap();
                        replicaArray = replicaTarget;
                        map[ns] = replicaArray;
                    }

                    // Parse partition bitmaps.
                    for (int i = 0; i < replicaCount; i++)
                    {
                        begin = ++offset;

                        // Find bitmap endpoint
                        while (offset < length)
                        {
                            byte b = buffer[offset];

                            if (b == ',' || b == ';')
                            {
                                break;
                            }
                            offset++;
                        }

                        if (offset == begin)
                        {
                            string response = GetTruncatedResponse();
                            throw new AerospikeException.Parse("Empty partition id for namespace " + ns + ". Response=" + response);
                        }

                        // Log.info("Map: " + namespace + '[' + i + "] " + node);
                        DecodeBitmap(node, replicaArray[i], begin);
                    }
                    begin = ++offset;
                }
                else
                {
                    offset++;
                }
            }
        }
 public void RefreshNamespaceData(Node node, Namespace ns)
 {
     /*
      * refresh namespace data
      */
     try {
         String nameSpaceString = Info.Request (infoPolicy, node, "namespace/" + ns);
         ns.MergeNamespaceInfo (nameSpaceString);
         String setsString = Info.Request (infoPolicy, node, "sets/" + ns);
         if (setsString.Length > 0) {
             String[] sets = setsString.Split (';');
             foreach (String setData in sets) {
                 ns.MergeSet (setData);
             }
         }
     } catch (AerospikeException e) {
         log.Error ("Error geting Namespace details", e);
     }
 }
        private void ParseReplicasMaster(Node node)
        {
            // Use low-level info methods and parse byte array directly for maximum performance.
            // Receive format: replicas-master\t<ns1>:<base 64 encoded bitmap1>;<ns2>:<base 64 encoded bitmap2>...\n
            ExpectName(ReplicasMaster);

            int begin = offset;

            while (offset < length)
            {
                if (buffer[offset] == ':')
                {
                    // Parse namespace.
                    string ns = ByteUtil.Utf8ToString(buffer, begin, offset - begin).Trim();

                    if (ns.Length <= 0 || ns.Length >= 32)
                    {
                        string response = GetTruncatedResponse();
                        throw new AerospikeException.Parse("Invalid partition namespace " + ns + ". Response=" + response);
                    }
                    begin = ++offset;

                    // Parse partition bitmap.
                    while (offset < length)
                    {
                        byte b = buffer[offset];

                        if (b == ';' || b == '\n')
                        {
                            break;
                        }
                        offset++;
                    }

                    if (offset == begin)
                    {
                        string response = GetTruncatedResponse();
                        throw new AerospikeException.Parse("Empty partition id for namespace " + ns + ". Response=" + response);
                    }

                    Node[][] replicaArray;

                    if (!map.TryGetValue(ns, out replicaArray))
                    {
                        replicaArray = new Node[1][];
                        replicaArray[0] = new Node[partitionCount];
                        CopyPartitionMap();
                        map[ns] = replicaArray;
                    }

                    // Log.info("Map: " + namespace + "[0] " + node);
                    DecodeBitmap(node, replicaArray[0], begin);
                    begin = ++offset;
                }
                else
                {
                    offset++;
                }
            }
        }
        //-------------------------------------------------------
        // Get Info via Node
        //-------------------------------------------------------
        /// <summary>
        /// Get one info value by name from the specified database server node.
        /// This method supports user authentication.
        /// </summary>
        /// <param name="node">server node</param>
        /// <param name="name">name of variable to retrieve</param>
        public static string Request(Node node, string name)
        {
            Connection conn = node.GetConnection(DEFAULT_TIMEOUT);

            try
            {
                string response = Info.Request(conn, name);
                node.PutConnection(conn);
                return response;
            }
            catch (Exception)
            {
                node.CloseConnection(conn);
                throw;
            }
        }
        protected internal int UpdatePartitions(Connection conn, Node node)
        {
            PartitionParser parser = new PartitionParser(conn, node, partitionMap, Node.PARTITIONS, requestProleReplicas);

            if (parser.IsPartitionMapCopied)
            {
                partitionMap = parser.PartitionMap;
            }
            return parser.Generation;
        }
        /// <summary>
        /// Read all records in specified namespace and set for one node only.
        /// <para>
        /// This call will block until the scan is complete - callbacks are made
        /// within the scope of this call.
        /// </para>
        /// </summary>
        /// <param name="policy">scan configuration parameters, pass in null for defaults</param>
        /// <param name="node">server node</param>
        /// <param name="ns">namespace - equivalent to database name</param>
        /// <param name="setName">optional set name - equivalent to database table</param>
        /// <param name="callback">read callback method - called with record data</param>
        /// <param name="binNames">
        /// optional bin to retrieve. All bins will be returned if not specified.
        /// Aerospike 2 servers ignore this parameter.
        /// </param>
        /// <exception cref="AerospikeException">if transaction fails</exception>
        public void ScanNode(ScanPolicy policy, Node node, string ns, string setName, ScanCallback callback, params string[] binNames)
        {
            if (policy == null)
            {
                policy = scanPolicyDefault;
            }
            ulong taskId = RandomShift.ThreadLocalInstance.NextLong();

            ScanCommand command = new ScanCommand(node, policy, ns, setName, callback, binNames, taskId);
            command.Execute();
        }
 private static BatchNode FindBatchNode(IList<BatchNode> nodes, Node node)
 {
     foreach (BatchNode batchNode in nodes)
     {
         // Note: using pointer equality for performance.
         if (batchNode.node == node)
         {
             return batchNode;
         }
     }
     return null;
 }