Exemple #1
0
        /// <summary>LoadContent
        /// </summary>
        public override void LoadContent(FastDFSOption option, byte[] data)
        {
            MetaData = new Dictionary <string, string>();
            int startIndex = 0;

            int itemSeparaterIndex;

            do
            {
                int keyValueSeparaterIndex = Array.IndexOf <byte>(data, Consts.METADATA_KEY_VALUE_SEPARATOR, startIndex);
                if (keyValueSeparaterIndex < 0)
                {
                    throw new ArgumentException("invalid metadata buffer format");
                }

                string key = ByteUtil.ByteToString(data, startIndex, keyValueSeparaterIndex - startIndex, option.Charset);
                startIndex = keyValueSeparaterIndex + 1;

                itemSeparaterIndex = Array.IndexOf <byte>(data, Consts.METADATA_PAIR_SEPARATER, startIndex);
                string value;
                if (itemSeparaterIndex < 0)
                {
                    value = ByteUtil.ByteToString(data, startIndex, (data.Length - 1) - startIndex, option.Charset);
                }
                else
                {
                    value = ByteUtil.ByteToString(data, startIndex, itemSeparaterIndex - startIndex, option.Charset);
                }
                startIndex = itemSeparaterIndex + 1;

                MetaData.Add(key, value);
            } while (itemSeparaterIndex >= 0);
        }
Exemple #2
0
        /// <summary>EncodeBody
        /// </summary>
        public override byte[] EncodeBody(FastDFSOption option)
        {
            //Header = new FDFSHeader(0, Consts.TRACKER_PROTO_CMD_SERVER_LIST_ALL_GROUPS, 0);
            var bodyBuffer = new byte[0];

            return(bodyBuffer);
        }
        /// <summary>EncodeBody
        /// </summary>
        public override byte[] EncodeBody(FastDFSOption option)
        {
            var bodyBuffer = EndecodeUtil.EncodeGroupName(GroupName, option.Charset);

            //Header = new FDFSHeader(Consts.FDFS_GROUP_NAME_MAX_LEN, Consts.TRACKER_PROTO_CMD_SERVER_LIST_STORAGE, 0);
            return(bodyBuffer);
        }
        /// <summary>LoadContent
        /// </summary>
        public override void LoadContent(FastDFSOption option, byte[] data)
        {
            int bytesRead = 0;

            byte[] groupNameBuffer = new byte[Consts.FDFS_GROUP_NAME_MAX_LEN];
            Array.Copy(data, bytesRead, groupNameBuffer, 0, Consts.FDFS_GROUP_NAME_MAX_LEN);
            GroupName = EndecodeUtil.DecodeString(groupNameBuffer, option.Charset);
            //Util.ByteToString(option.Charset, groupNameBuffer).TrimEnd('\0');
            bytesRead += Consts.FDFS_GROUP_NAME_MAX_LEN;

            byte[] ipAddressBuffer = new byte[Consts.IP_ADDRESS_SIZE - 1];
            Array.Copy(data, bytesRead, ipAddressBuffer, 0, Consts.IP_ADDRESS_SIZE - 1);
            IPAddresses.Add(EndecodeUtil.DecodeString(ipAddressBuffer, option.Charset));
            //IPAddresses.Add(new string(option.Charset.GetChars(ipAddressBuffer)).TrimEnd('\0'));
            bytesRead += Consts.IP_ADDRESS_SIZE - 1;

            byte[] portBuffer = new byte[Consts.FDFS_PROTO_PKG_LEN_SIZE];
            Array.Copy(data, bytesRead, portBuffer, 0, Consts.FDFS_PROTO_PKG_LEN_SIZE);
            Port       = (int)ByteUtil.BufferToLong(portBuffer, 0);
            bytesRead += Consts.FDFS_PROTO_PKG_LEN_SIZE;

            while (data.Length - bytesRead >= Consts.IP_ADDRESS_SIZE - 1)
            {
                ipAddressBuffer = new byte[Consts.IP_ADDRESS_SIZE - 1];
                Array.Copy(data, bytesRead, ipAddressBuffer, 0, Consts.IP_ADDRESS_SIZE - 1);
                IPAddresses.Add(EndecodeUtil.DecodeString(ipAddressBuffer, option.Charset));
                // IPAddresses.Add(new string(option.Charset.GetChars(ipAddressBuffer)).TrimEnd('\0'));
                bytesRead += Consts.IP_ADDRESS_SIZE - 1;
            }
        }
        public void ClusterConfigurations_Get_Test()
        {
            var option = new FastDFSOption()
            {
                ClusterConfigurations = new List <ClusterConfiguration>()
                {
                    new ClusterConfiguration()
                    {
                        Name    = "cluster1",
                        Charset = "utf-8",
                        TrackerMaxConnection = 1,
                        StorageMaxConnection = 2,
                        Trackers             = new List <Tracker>()
                        {
                            new Tracker("127.0.0.1", 22122)
                        }
                    }
                }
            };

            var options = Options.Create <FastDFSOption>(option);
            IClusterSelector clusterSelector = new DefaultClusterSelector(options);

            var configuration = clusterSelector.Get("cluster1");

            Assert.Equal("cluster1", configuration.Name);
            Assert.Equal(1, configuration.TrackerMaxConnection);
            Assert.Equal(2, configuration.StorageMaxConnection);
        }
Exemple #6
0
        /// <summary>EncodeBody
        /// </summary>
        public override byte[] EncodeBody(FastDFSOption option)
        {
            var groupNameBuffer = EndecodeUtil.EncodeGroupName(GroupName, option.Charset);
            var fileIdBuffer    = EndecodeUtil.EncodeString(FileId, option.Charset);

            //var length = Consts.FDFS_GROUP_NAME_MAX_LEN + fileIdBuffer.Length;
            return(ByteUtil.Combine(groupNameBuffer, fileIdBuffer));
        }
 /// <summary>LoadContent
 /// </summary>
 public override void LoadContent(FastDFSOption option, byte[] data)
 {
     if (data.Length != Consts.FDFS_GROUP_INFO_SIZE)
     {
         throw new ArgumentException($"返回数据长度:{data.Length},不是有效的GroupInfo数据长度.");
     }
     GroupInfo = EndecodeUtil.DecodeGroupInfo(data, option.Charset);
 }
Exemple #8
0
        /// <summary>EncodeBody
        /// </summary>
        public override byte[] EncodeBody(FastDFSOption option)
        {
            //消息体长度为group name的最大长度,16

            var bodyBuffer = EndecodeUtil.EncodeGroupName(GropName, option.Charset);

            //Header = new FDFSHeader(Consts.FDFS_GROUP_NAME_MAX_LEN, Consts.TRACKER_PROTO_CMD_SERVICE_QUERY_STORE_WITH_GROUP_ONE, 0);
            return(bodyBuffer);
        }
Exemple #9
0
        /// <summary>EncodeBody
        /// </summary>
        public override byte[] EncodeBody(FastDFSOption option)
        {
            var fileIdLengthBuffer = ByteUtil.LongToBuffer(FileId.Length);
            var fileSizeBuffer     = ByteUtil.LongToBuffer(InputStream.Length);
            var fileIdBuffer       = ByteUtil.StringToByte(FileId, option.Charset);

            //long length = Consts.FDFS_PROTO_PKG_LEN_SIZE + Consts.FDFS_PROTO_PKG_LEN_SIZE + FileId.Length + RequestStream.Length;

            return(ByteUtil.Combine(fileIdLengthBuffer, fileSizeBuffer, fileIdBuffer));
        }
        /// <summary>LoadContent
        /// </summary>
        public override void LoadContent(FastDFSOption option, byte[] data)
        {
            byte[] groupNameBuffer = new byte[Consts.FDFS_GROUP_NAME_MAX_LEN];
            Array.Copy(data, groupNameBuffer, Consts.FDFS_GROUP_NAME_MAX_LEN);
            GroupName = ByteUtil.ByteToString(groupNameBuffer, option.Charset).TrimEnd('\0');

            byte[] fileNameBuffer = new byte[data.Length - Consts.FDFS_GROUP_NAME_MAX_LEN];
            Array.Copy(data, Consts.FDFS_GROUP_NAME_MAX_LEN, fileNameBuffer, 0, fileNameBuffer.Length);
            FileId = ByteUtil.ByteToString(fileNameBuffer, option.Charset).TrimEnd('\0');
        }
Exemple #11
0
        public DefaultConnectionManager(ILogger <DefaultConnectionManager> logger, IConnectionPoolBuilder connectionPoolFactory, IOptions <FastDFSOption> option)
        {
            _logger = logger;
            _connectionPoolFactory = connectionPoolFactory;
            _option = option.Value;

            _trackerConnectionAddresses = new List <ConnectionAddress>();
            _trackerConnectionPools     = new ConcurrentDictionary <ConnectionAddress, IConnectionPool>();
            _storageConnectionPools     = new ConcurrentDictionary <ConnectionAddress, IConnectionPool>();
        }
Exemple #12
0
        /// <summary>LoadContent
        /// </summary>
        public override void LoadContent(FastDFSOption option, byte[] data)
        {
            var span          = data.AsSpan();
            var groupNameSpan = span.Slice(0, Consts.FDFS_GROUP_NAME_MAX_LEN);

            GroupName = EndecodeUtil.DecodeString(groupNameSpan.ToArray(), option.Charset);

            var fileNameSpan = span.Slice(Consts.FDFS_GROUP_NAME_MAX_LEN, data.Length - Consts.FDFS_GROUP_NAME_MAX_LEN);

            FileId = EndecodeUtil.DecodeString(fileNameSpan.ToArray(), option.Charset);
        }
        public void ClusterConfigurations_Empty_Test()
        {
            var option = new FastDFSOption();

            var options = Options.Create <FastDFSOption>(option);
            IClusterSelector clusterSelector = new DefaultClusterSelector(options);

            Assert.Throws <ArgumentNullException>(() =>
            {
                clusterSelector.Get("cluster1");
            });
        }
        /// <summary>EncodeBody
        /// </summary>
        public override byte[] EncodeBody(FastDFSOption option)
        {
            var groupNameBuffer = EndecodeUtil.EncodeGroupName(GroupName, option.Charset);
            //文件偏移量
            var offsetBuffer = EndecodeUtil.EncodeLong(Offset);
            //下载文件的大小,全部下载用0
            var byteSizeBuffer = EndecodeUtil.EncodeLong(ByteSize);
            //文件FileId数组
            var fileIdBuffer = EndecodeUtil.EncodeString(FileId, option.Charset);

            //long length = Consts.FDFS_PROTO_PKG_LEN_SIZE + Consts.FDFS_PROTO_PKG_LEN_SIZE + Consts.FDFS_GROUP_NAME_MAX_LEN + FileId.Length;

            return(ByteUtil.Combine(offsetBuffer, byteSizeBuffer, groupNameBuffer, fileIdBuffer));
        }
        /// <summary>LoadContent
        /// </summary>
        public override void LoadContent(FastDFSOption option, byte[] data)
        {
            byte[] fileSizeBuffer   = new byte[Consts.FDFS_PROTO_PKG_LEN_SIZE];
            byte[] createTimeBuffer = new byte[Consts.FDFS_PROTO_PKG_LEN_SIZE];
            byte[] crcBuffer        = new byte[Consts.FDFS_PROTO_PKG_LEN_SIZE];

            Array.Copy(data, 0, fileSizeBuffer, 0, fileSizeBuffer.Length);
            Array.Copy(data, Consts.FDFS_PROTO_PKG_LEN_SIZE, createTimeBuffer, 0, createTimeBuffer.Length);
            Array.Copy(data, Consts.FDFS_PROTO_PKG_LEN_SIZE + Consts.FDFS_PROTO_PKG_LEN_SIZE, crcBuffer, 0, crcBuffer.Length);

            FileSize   = ByteUtil.BufferToLong(data, 0);
            CreateTime = new System.DateTime(1970, 1, 1).AddSeconds(ByteUtil.BufferToLong(data, Consts.FDFS_PROTO_PKG_LEN_SIZE));

            Crc32 = ByteUtil.BufferToLong(data, Consts.FDFS_PROTO_PKG_LEN_SIZE + Consts.FDFS_PROTO_PKG_LEN_SIZE);
        }
        /// <summary>LoadContent
        /// </summary>
        public override void LoadContent(FastDFSOption option, byte[] data)
        {
            byte[] groupNameBuffer = new byte[Consts.FDFS_GROUP_NAME_MAX_LEN];
            Array.Copy(data, groupNameBuffer, Consts.FDFS_GROUP_NAME_MAX_LEN);
            GroupName = ByteUtil.ByteToString(groupNameBuffer, option.Charset).TrimEnd('\0');

            byte[] ipAddressBuffer = new byte[Consts.IP_ADDRESS_SIZE - 1];
            Array.Copy(data, Consts.FDFS_GROUP_NAME_MAX_LEN, ipAddressBuffer, 0, Consts.IP_ADDRESS_SIZE - 1);
            IPAddress = new string(Encoding.GetEncoding(option.Charset).GetChars(ipAddressBuffer)).TrimEnd('\0');

            byte[] portBuffer = new byte[Consts.FDFS_PROTO_PKG_LEN_SIZE];
            Array.Copy(data, Consts.FDFS_GROUP_NAME_MAX_LEN + Consts.IP_ADDRESS_SIZE - 1,
                       portBuffer, 0, Consts.FDFS_PROTO_PKG_LEN_SIZE);
            Port = (int)ByteUtil.BufferToLong(portBuffer, 0);
        }
Exemple #17
0
        ///// <summary>是否流请求
        ///// </summary>
        //public override bool StreamRequest => true;

        /// <summary>EncodeBody
        /// </summary>
        public override byte[] EncodeBody(FastDFSOption option)
        {
            var fileSizeBuffer = ByteUtil.LongToBuffer(InputStream.Length);
            var extBuffer      = EndecodeUtil.EncodeFileExt(FileExt, option.Charset);

            /*long lenth = 1 + Consts.FDFS_PROTO_PKG_LEN_SIZE + Consts.FDFS_FILE_EXT_NAME_MAX_LEN;*/

            var bodyBuffer = new List <byte>
            {
                StorePathIndex
            };

            bodyBuffer.AddRange(fileSizeBuffer);
            bodyBuffer.AddRange(extBuffer);
            return(bodyBuffer.ToArray());
        }
Exemple #18
0
        private byte[] CreateMetaDataBuffer(FastDFSOption option, IDictionary <string, string> metaData)
        {
            List <byte> metaDataBuffer = new List <byte>();

            foreach (KeyValuePair <string, string> p in metaData)
            {
                // insert a separater if this is not the first meta data item.
                if (metaDataBuffer.Count != 0)
                {
                    metaDataBuffer.Add(Consts.METADATA_PAIR_SEPARATER);
                }

                metaDataBuffer.AddRange(EndecodeUtil.EncodeString(p.Key, option.Charset));
                metaDataBuffer.Add(Consts.METADATA_KEY_VALUE_SEPARATOR);
                metaDataBuffer.AddRange(EndecodeUtil.EncodeString(p.Value, option.Charset));
            }
            return(metaDataBuffer.ToArray());
        }
Exemple #19
0
        /// <summary>LoadContent
        /// </summary>
        public override void LoadContent(FastDFSOption option, byte[] data)
        {
            var dataSpan            = data.AsSpan();
            var groupNameBufferSpan = dataSpan.Slice(0, Consts.FDFS_GROUP_NAME_MAX_LEN);

            GroupName = ByteUtil.ByteToString(groupNameBufferSpan.ToArray(), option.Charset).TrimEnd('\0');
            var fileNameBufferSpan = dataSpan.Slice(Consts.FDFS_GROUP_NAME_MAX_LEN);

            FileId = ByteUtil.ByteToString(fileNameBufferSpan.ToArray(), option.Charset).TrimEnd('\0');

            //byte[] groupNameBuffer = new byte[Consts.FDFS_GROUP_NAME_MAX_LEN];
            //Array.Copy(data, groupNameBuffer, Consts.FDFS_GROUP_NAME_MAX_LEN);
            //GroupName = ByteUtil.ByteToString(groupNameBuffer, option.Charset).TrimEnd('\0');

            //byte[] fileNameBuffer = new byte[data.Length - Consts.FDFS_GROUP_NAME_MAX_LEN];
            //Array.Copy(data, Consts.FDFS_GROUP_NAME_MAX_LEN, fileNameBuffer, 0, fileNameBuffer.Length);
            //FileId = ByteUtil.ByteToString(fileNameBuffer, option.Charset).TrimEnd('\0');
        }
Exemple #20
0
        /// <summary>LoadContent
        /// </summary>
        public override void LoadContent(FastDFSOption option, byte[] data)
        {
            if (data.Length % Consts.FDFS_STORAGE_INFO_SIZE != 0)
            {
                throw new ArgumentException("返回数据长度不正确,不是'FDFS_STORAGE_INFO_SIZE' 的整数倍.");
            }
            var count = data.Length / Consts.FDFS_STORAGE_INFO_SIZE;

            var dataSpan = data.AsSpan();

            for (int i = 0; i < count; i++)
            {
                //var buffer = new byte[Consts.FDFS_STORAGE_INFO_SIZE];
                //Array.Copy(data, i * Consts.FDFS_STORAGE_INFO_SIZE, buffer, 0, buffer.Length);
                var bufferSpan = dataSpan.Slice(i * Consts.FDFS_STORAGE_INFO_SIZE, Consts.FDFS_STORAGE_INFO_SIZE);

                var storageInfo = EndecodeUtil.DecodeStorageInfo(bufferSpan.ToArray(), option.Charset);
                StorageInfos.Add(storageInfo);
            }
        }
        public void ClusterConfigurations_Get_Default_Test()
        {
            var option = new FastDFSOption()
            {
                ClusterConfigurations = new List <ClusterConfiguration>()
                {
                    new ClusterConfiguration()
                    {
                        Name    = "cluster2",
                        Charset = "utf-8"
                    }
                }
            };

            var options = Options.Create <FastDFSOption>(option);
            IClusterSelector clusterSelector = new DefaultClusterSelector(options);

            var configuration = clusterSelector.Get("cluster1");

            Assert.Equal("cluster2", configuration.Name);
        }
Exemple #22
0
        ///// <summary>使用流传输
        ///// </summary>
        //public override bool StreamRequest => true;

        /// <summary>EncodeBody
        /// </summary>
        public override byte[] EncodeBody(FastDFSOption option)
        {
            //1.StorePathIndex

            //2.文件长度
            var fileSizeBuffer = EndecodeUtil.EncodeLong(InputStream.Length);

            //3.扩展名
            byte[] extBuffer = EndecodeUtil.EncodeFileExt(FileExt, option.Charset);
            //4.文件数据,这里不写入
            //int lenth = 1 + Consts.FDFS_PROTO_PKG_LEN_SIZE + Consts.FDFS_FILE_EXT_NAME_MAX_LEN;

            var bodyBuffer = new List <byte>
            {
                StorePathIndex
            };

            bodyBuffer.AddRange(fileSizeBuffer);
            bodyBuffer.AddRange(extBuffer);
            return(bodyBuffer.ToArray());
        }
Exemple #23
0
        ///// <summary>是否流请求
        ///// </summary>
        //public override bool StreamRequest => true;

        /// <summary>EncodeBody
        /// </summary>
        public override byte[] EncodeBody(FastDFSOption option)
        {
            //文件名长度数组
            var masterFileIdLenBuffer = EndecodeUtil.EncodeLong((long)MasterFileId.Length);
            //文件长度数组
            var fileSizeBuffer = EndecodeUtil.EncodeLong(InputStream.Length);

            //从文件前缀名数据
            var prefixBuffer = EndecodeUtil.EncodePrefix(Prefix, option.Charset);
            var extBuffer    = EndecodeUtil.EncodeFileExt(FileExt, option.Charset);
            //主文件Id
            var masterFileIdBuffer = EndecodeUtil.EncodeString(MasterFileId, option.Charset);


            //2个长度,主文件FileId数组长度,文件长度
            //long length = 2 * Consts.FDFS_PROTO_PKG_LEN_SIZE + Consts.FDFS_FILE_PREFIX_MAX_LEN + Consts.FDFS_FILE_EXT_NAME_MAX_LEN + masterFileIdBuffer.Length;

            return(ByteUtil.Combine(masterFileIdLenBuffer, fileSizeBuffer, prefixBuffer, extBuffer, masterFileIdBuffer));

            //文件内容
            //Array.Copy(ContentBytes, 0, bodyBuffer, offset, ContentBytes.Length);
        }
Exemple #24
0
        /// <summary>EncodeBody
        /// </summary>
        public override byte[] EncodeBody(FastDFSOption option)
        {
            string optionString = (Option == MetaDataOption.Overwrite) ? "O" : "M";
            var    optionBuffer = EndecodeUtil.EncodeString(optionString, option.Charset);

            var groupNameBuffer = EndecodeUtil.EncodeGroupName(GroupName, option.Charset);


            var fileIdBuffer   = ByteUtil.StringToByte(FileId, option.Charset);
            var metaDataBuffer = CreateMetaDataBuffer(option, MetaData);

            var fileIdLengthBuffer = ByteUtil.LongToBuffer(fileIdBuffer.Length);
            var metaDataSizeBuffer = ByteUtil.LongToBuffer(metaDataBuffer.Length);

            //int length = Consts.FDFS_PROTO_PKG_LEN_SIZE +  // filename length
            //             Consts.FDFS_PROTO_PKG_LEN_SIZE +  // metadata size
            //             1 +  // operation flag
            //             Consts.FDFS_GROUP_NAME_MAX_LEN +  // group name
            //             fileIdBuffer.Length +  // file name
            //             metaDataBuffer.Length;            // metadata


            return(ByteUtil.Combine(fileIdLengthBuffer, metaDataSizeBuffer, optionBuffer, groupNameBuffer, fileIdBuffer, metaDataBuffer));
        }
Exemple #25
0
 /// <summary>LoadContent
 /// </summary>
 public virtual void LoadContent(FastDFSOption option, byte[] data)
 {
 }
Exemple #26
0
 /// <summary>Ctor
 /// </summary>
 public ReConnectHandler(ILogger <ReConnectHandler> logger, FastDFSOption option, Func <Task> reConnectAction)
 {
     _logger          = logger;
     _option          = option;
     _reConnectAction = reConnectAction;
 }
Exemple #27
0
 public abstract byte[] EncodeBody(FastDFSOption option);
        public void Get_Default_CreateNew_Test()
        {
            var option = new FastDFSOption()
            {
                ClusterConfigurations = new List <ClusterConfiguration>()
                {
                    new ClusterConfiguration()
                    {
                        Name     = "cluster1",
                        Trackers = new List <Tracker>()
                        {
                            new Tracker("127.0.0.1", 22122)
                        }
                    }
                }
            };

            var options = Options.Create <FastDFSOption>(option);

            var mockCluster = new Mock <ICluster>();

            mockCluster.Setup(x => x.Name).Returns("cluster1");

            var mockScopeServiceProvider = new Mock <IServiceProvider>();

            mockScopeServiceProvider.Setup(x => x.GetService(typeof(ICluster)))
            .Returns(mockCluster.Object);

            mockScopeServiceProvider.Setup(x => x.GetService(typeof(ClusterConfiguration)))
            .Returns(option.ClusterConfigurations.FirstOrDefault());

            var mockServiceScope = new Mock <IServiceScope>();

            mockServiceScope.Setup(x => x.ServiceProvider)
            .Returns(mockScopeServiceProvider.Object);

            var mockScopeFactory = new Mock <IServiceScopeFactory>();

            mockScopeFactory.Setup(x => x.CreateScope())
            .Returns(mockServiceScope.Object);

            var mockServiceProvider = new Mock <IServiceProvider>();

            mockServiceProvider.Setup(x => x.GetService(typeof(IServiceScopeFactory)))
            .Returns(mockScopeFactory.Object);

            var mockClusterSelector = new Mock <IClusterSelector>();

            mockClusterSelector.Setup(x => x.Get("cluster1")).Returns(option.ClusterConfigurations.FirstOrDefault());


            IClusterFactory clusterFactory = new DefaultClusterFactory(_mockLogger.Object, mockServiceProvider.Object, options, mockClusterSelector.Object);

            var cluster = clusterFactory.Get("");

            mockClusterSelector.Verify(x => x.Get("cluster1"), Times.Once);
            mockScopeServiceProvider.Verify(x => x.GetService(typeof(ICluster)), Times.Once);
            mockScopeServiceProvider.Verify(x => x.GetService(typeof(ClusterConfiguration)), Times.Once);

            var cluster2 = clusterFactory.Get("");

            Assert.Equal("cluster1", cluster2.Name);
        }
Exemple #29
0
 /// <summary>LoadContent
 /// </summary>
 public override void LoadContent(FastDFSOption option, byte[] data)
 {
     Content = data;
 }