/// <summary> /// query storage server to upload file /// </summary> /// <param name="trackerServer">the tracker server</param> /// <param name="groupName">the group name to upload file to, can be empty</param> /// <returns> storage server object, return null if fail</returns> public StorageServer getStoreStorage(TrackerServer trackerServer, string groupName) { byte[] header; string ip_addr; int port; byte cmd; int out_len; byte store_path; Connection connection; if (trackerServer == null) { trackerServer = getTrackerServer(); } connection = trackerServer.getConnection(); var outStream = connection.getOutputStream(); try { if (groupName == null || groupName.Length == 0) { cmd = ProtoCommon.TRACKER_PROTO_CMD_SERVICE_QUERY_STORE_WITHOUT_GROUP_ONE; out_len = 0; } else { cmd = ProtoCommon.TRACKER_PROTO_CMD_SERVICE_QUERY_STORE_WITH_GROUP_ONE; out_len = ProtoCommon.FDFS_GROUP_NAME_MAX_LEN; } header = ProtoCommon.packHeader(cmd, out_len, (byte)0); outStream.Write(header, 0, header.Length); if (groupName != null && groupName.Length > 0) { byte[] bGroupName; byte[] bs; int group_len; bs = ClientGlobal.g_charset.GetBytes(groupName); bGroupName = new byte[ProtoCommon.FDFS_GROUP_NAME_MAX_LEN]; if (bs.Length <= ProtoCommon.FDFS_GROUP_NAME_MAX_LEN) { group_len = bs.Length; } else { group_len = ProtoCommon.FDFS_GROUP_NAME_MAX_LEN; } Arrays.fill(bGroupName, (byte)0); Array.Copy(bs, 0, bGroupName, 0, group_len); outStream.Write(bGroupName, 0, bGroupName.Length); } ProtoCommon.RecvPackageInfo pkgInfo = ProtoCommon.recvPackage(connection.getInputStream(), ProtoCommon.TRACKER_PROTO_CMD_RESP, ProtoCommon.TRACKER_QUERY_STORAGE_STORE_BODY_LEN); this.errno = pkgInfo.errno; if (pkgInfo.errno != 0) { return(null); } ip_addr = Strings.Get(pkgInfo.body, ProtoCommon.FDFS_GROUP_NAME_MAX_LEN, ProtoCommon.FDFS_IPADDR_SIZE - 1).Trim(); port = (int)ProtoCommon.buff2long(pkgInfo.body, ProtoCommon.FDFS_GROUP_NAME_MAX_LEN + ProtoCommon.FDFS_IPADDR_SIZE - 1); store_path = pkgInfo.body[ProtoCommon.TRACKER_QUERY_STORAGE_STORE_BODY_LEN - 1]; return(new StorageServer(ip_addr, port, store_path)); } catch (IOException ex) { try { connection.close(); } catch (IOException ex1) { throw ex1; } finally { connection = null; } throw ex; } finally { if (connection != null) { try { connection.release(); } catch { } } } }
/// <summary> /// delete a storage server from the tracker server /// </summary> /// <param name="trackerServer">the connected tracker server</param> /// <param name="groupName">the group name of storage server</param> /// <param name="storageIpAddr">the storage server ip address</param> /// <returns> true for success, false for fail</returns> private bool deleteStorage(TrackerServer trackerServer, string groupName, string storageIpAddr) { byte[] header; byte[] bGroupName; byte[] bs; int len; Connection connection = null; try { connection = trackerServer.getConnection(); Stream outStream = connection.getOutputStream(); bs = ClientGlobal.g_charset.GetBytes(groupName); bGroupName = new byte[ProtoCommon.FDFS_GROUP_NAME_MAX_LEN]; if (bs.Length <= ProtoCommon.FDFS_GROUP_NAME_MAX_LEN) { len = bs.Length; } else { len = ProtoCommon.FDFS_GROUP_NAME_MAX_LEN; } Arrays.fill(bGroupName, (byte)0); Array.Copy(bs, 0, bGroupName, 0, len); int ipAddrLen; byte[] bIpAddr = ClientGlobal.g_charset.GetBytes(storageIpAddr); if (bIpAddr.Length < ProtoCommon.FDFS_IPADDR_SIZE) { ipAddrLen = bIpAddr.Length; } else { ipAddrLen = ProtoCommon.FDFS_IPADDR_SIZE - 1; } header = ProtoCommon.packHeader(ProtoCommon.TRACKER_PROTO_CMD_SERVER_DELETE_STORAGE, ProtoCommon.FDFS_GROUP_NAME_MAX_LEN + ipAddrLen, (byte)0); byte[] wholePkg = new byte[header.Length + bGroupName.Length + ipAddrLen]; Array.Copy(header, 0, wholePkg, 0, header.Length); Array.Copy(bGroupName, 0, wholePkg, header.Length, bGroupName.Length); Array.Copy(bIpAddr, 0, wholePkg, header.Length + bGroupName.Length, ipAddrLen); outStream.Write(wholePkg, 0, wholePkg.Length); ProtoCommon.RecvPackageInfo pkgInfo = ProtoCommon.recvPackage(connection.getInputStream(), ProtoCommon.TRACKER_PROTO_CMD_RESP, 0); this.errno = pkgInfo.errno; return(pkgInfo.errno == 0); } catch (IOException e) { try { connection.close(); } finally { connection = null; } throw e; } finally { if (connection != null) { connection.release(); } } }
/// <summary> /// query storage server stat info of the group /// </summary> /// <param name="trackerServer">the tracker server</param> /// <param name="groupName">the group name of storage server</param> /// <param name="storageIpAddr">the storage server ip address, can be null or empty</param> /// <returns> storage server stat array, return null if fail</returns> public StructStorageStat[] listStorages(TrackerServer trackerServer, string groupName, string storageIpAddr) { byte[] header; byte[] bGroupName; byte[] bs; int len; Connection connection; if (trackerServer == null) { trackerServer = getTrackerServer(); if (trackerServer == null) { return(null); } } connection = trackerServer.getConnection(); Stream outStream = connection.getOutputStream(); try { bs = ClientGlobal.g_charset.GetBytes(groupName); bGroupName = new byte[ProtoCommon.FDFS_GROUP_NAME_MAX_LEN]; if (bs.Length <= ProtoCommon.FDFS_GROUP_NAME_MAX_LEN) { len = bs.Length; } else { len = ProtoCommon.FDFS_GROUP_NAME_MAX_LEN; } Arrays.fill(bGroupName, (byte)0); Array.Copy(bs, 0, bGroupName, 0, len); int ipAddrLen; byte[] bIpAddr; if (storageIpAddr != null && storageIpAddr.Length > 0) { bIpAddr = ClientGlobal.g_charset.GetBytes(storageIpAddr); if (bIpAddr.Length < ProtoCommon.FDFS_IPADDR_SIZE) { ipAddrLen = bIpAddr.Length; } else { ipAddrLen = ProtoCommon.FDFS_IPADDR_SIZE - 1; } } else { bIpAddr = null; ipAddrLen = 0; } header = ProtoCommon.packHeader(ProtoCommon.TRACKER_PROTO_CMD_SERVER_LIST_STORAGE, ProtoCommon.FDFS_GROUP_NAME_MAX_LEN + ipAddrLen, (byte)0); byte[] wholePkg = new byte[header.Length + bGroupName.Length + ipAddrLen]; Array.Copy(header, 0, wholePkg, 0, header.Length); Array.Copy(bGroupName, 0, wholePkg, header.Length, bGroupName.Length); if (ipAddrLen > 0) { Array.Copy(bIpAddr, 0, wholePkg, header.Length + bGroupName.Length, ipAddrLen); } outStream.Write(wholePkg, 0, wholePkg.Length); ProtoCommon.RecvPackageInfo pkgInfo = ProtoCommon.recvPackage(connection.getInputStream(), ProtoCommon.TRACKER_PROTO_CMD_RESP, -1); this.errno = pkgInfo.errno; if (pkgInfo.errno != 0) { return(null); } ProtoStructDecoder <StructStorageStat> decoder = new ProtoStructDecoder <StructStorageStat>(); return(decoder.decode(pkgInfo.body, StructStorageStat.getFieldsTotalSize())); } catch (IOException ex) { try { connection.close(); } catch (IOException ex1) { throw ex1; } throw ex; } catch (Exception ex) { Console.WriteLine(ex.Message); this.errno = ProtoCommon.ERR_NO_EINVAL; return(null); } finally { if (connection != null) { try { connection.release(); } catch { } } } }
/// <summary> /// list groups /// </summary> /// <param name="trackerServer">the tracker server</param> /// <returns> group stat array, return null if fail</returns> public StructGroupStat[] listGroups(TrackerServer trackerServer) { byte[] header; //string ip_addr; //int port; //byte cmd; //int out_len; //byte store_path; Connection connection; if (trackerServer == null) { trackerServer = getTrackerServer(); if (trackerServer == null) { return(null); } } connection = trackerServer.getConnection(); Stream outStream = connection.getOutputStream(); try { header = ProtoCommon.packHeader(ProtoCommon.TRACKER_PROTO_CMD_SERVER_LIST_GROUP, 0, (byte)0); outStream.Write(header, 0, header.Length); ProtoCommon.RecvPackageInfo pkgInfo = ProtoCommon.recvPackage(connection.getInputStream(), ProtoCommon.TRACKER_PROTO_CMD_RESP, -1); this.errno = pkgInfo.errno; if (pkgInfo.errno != 0) { return(null); } ProtoStructDecoder <StructGroupStat> decoder = new ProtoStructDecoder <StructGroupStat>(); return(decoder.decode(pkgInfo.body, StructGroupStat.getFieldsTotalSize())); } catch (IOException ex) { try { connection.close(); } catch (IOException ex1) { throw ex1; } finally { connection = null; } throw ex; } catch (Exception ex) { Console.WriteLine(ex.Message); this.errno = ProtoCommon.ERR_NO_EINVAL; return(null); } finally { if (connection != null) { try { connection.release(); } catch { } } } }
/// <summary> /// query storage server to download file /// </summary> /// <param name="trackerServer">the tracker server</param> /// <param name="cmd">command code, ProtoCommon.TRACKER_PROTO_CMD_SERVICE_QUERY_FETCH_ONE orProtoCommon.TRACKER_PROTO_CMD_SERVICE_QUERY_UPDATE</param> /// <param name="groupName">the group name of storage server</param> /// <param name="filename">filename on storage server</param> /// <returns> storage server JavaSocket object, return null if fail</returns> protected ServerInfo[] getStorages(TrackerServer trackerServer, byte cmd, string groupName, string filename) { byte[] header; byte[] bFileName; byte[] bGroupName; byte[] bs; int len; string ip_addr; int port; Connection connection; if (trackerServer == null) { trackerServer = getTrackerServer(); if (trackerServer == null) { return(null); } } connection = trackerServer.getConnection(); Stream outStream = connection.getOutputStream(); try { bs = ClientGlobal.g_charset.GetBytes(groupName); bGroupName = new byte[ProtoCommon.FDFS_GROUP_NAME_MAX_LEN]; bFileName = ClientGlobal.g_charset.GetBytes(filename); if (bs.Length <= ProtoCommon.FDFS_GROUP_NAME_MAX_LEN) { len = bs.Length; } else { len = ProtoCommon.FDFS_GROUP_NAME_MAX_LEN; } Arrays.fill(bGroupName, (byte)0); Array.Copy(bs, 0, bGroupName, 0, len); header = ProtoCommon.packHeader(cmd, ProtoCommon.FDFS_GROUP_NAME_MAX_LEN + bFileName.Length, (byte)0); byte[] wholePkg = new byte[header.Length + bGroupName.Length + bFileName.Length]; Array.Copy(header, 0, wholePkg, 0, header.Length); Array.Copy(bGroupName, 0, wholePkg, header.Length, bGroupName.Length); Array.Copy(bFileName, 0, wholePkg, header.Length + bGroupName.Length, bFileName.Length); outStream.Write(wholePkg, 0, wholePkg.Length); ProtoCommon.RecvPackageInfo pkgInfo = ProtoCommon.recvPackage(connection.getInputStream(), ProtoCommon.TRACKER_PROTO_CMD_RESP, -1); this.errno = pkgInfo.errno; if (pkgInfo.errno != 0) { return(null); } if (pkgInfo.body.Length < ProtoCommon.TRACKER_QUERY_STORAGE_FETCH_BODY_LEN) { throw new IOException("Invalid body length: " + pkgInfo.body.Length); } if ((pkgInfo.body.Length - ProtoCommon.TRACKER_QUERY_STORAGE_FETCH_BODY_LEN) % (ProtoCommon.FDFS_IPADDR_SIZE - 1) != 0) { throw new IOException("Invalid body length: " + pkgInfo.body.Length); } int server_count = 1 + (pkgInfo.body.Length - ProtoCommon.TRACKER_QUERY_STORAGE_FETCH_BODY_LEN) / (ProtoCommon.FDFS_IPADDR_SIZE - 1); ip_addr = Strings.Get(pkgInfo.body, ProtoCommon.FDFS_GROUP_NAME_MAX_LEN, ProtoCommon.FDFS_IPADDR_SIZE - 1).Trim(); int offset = ProtoCommon.FDFS_GROUP_NAME_MAX_LEN + ProtoCommon.FDFS_IPADDR_SIZE - 1; port = (int)ProtoCommon.buff2long(pkgInfo.body, offset); offset += ProtoCommon.FDFS_PROTO_PKG_LEN_SIZE; ServerInfo[] servers = new ServerInfo[server_count]; servers[0] = new ServerInfo(ip_addr, port); for (int i = 1; i < server_count; i++) { servers[i] = new ServerInfo(Strings.Get(pkgInfo.body, offset, ProtoCommon.FDFS_IPADDR_SIZE - 1).Trim(), port); offset += ProtoCommon.FDFS_IPADDR_SIZE - 1; } return(servers); } catch (IOException ex) { try { connection.close(); } catch (IOException ex1) { throw ex1; } finally { connection = null; } throw ex; } finally { if (connection != null) { try { connection.release(); } catch { } } } }
/// <summary> /// query storage servers to upload file /// </summary> /// <param name="trackerServer">the tracker server</param> /// <param name="groupName">the group name to upload file to, can be empty</param> /// <returns> storage servers, return null if fail</returns> public StorageServer[] getStoreStorages(TrackerServer trackerServer, string groupName) { byte[] header; string ip_addr; int port; byte cmd; int out_len; Connection connection; if (trackerServer == null) { trackerServer = getTrackerServer(); if (trackerServer == null) { return(null); } } connection = trackerServer.getConnection(); Stream outStream = connection.getOutputStream(); try { if (groupName == null || groupName.Length == 0) { cmd = ProtoCommon.TRACKER_PROTO_CMD_SERVICE_QUERY_STORE_WITHOUT_GROUP_ALL; out_len = 0; } else { cmd = ProtoCommon.TRACKER_PROTO_CMD_SERVICE_QUERY_STORE_WITH_GROUP_ALL; out_len = ProtoCommon.FDFS_GROUP_NAME_MAX_LEN; } header = ProtoCommon.packHeader(cmd, out_len, (byte)0); outStream.Write(header, 0, header.Length); if (groupName != null && groupName.Length > 0) { byte[] bGroupName; byte[] bs; int group_len; bs = ClientGlobal.g_charset.GetBytes(groupName); bGroupName = new byte[ProtoCommon.FDFS_GROUP_NAME_MAX_LEN]; if (bs.Length <= ProtoCommon.FDFS_GROUP_NAME_MAX_LEN) { group_len = bs.Length; } else { group_len = ProtoCommon.FDFS_GROUP_NAME_MAX_LEN; } Arrays.fill(bGroupName, (byte)0); Array.Copy(bs, 0, bGroupName, 0, group_len); outStream.Write(bGroupName, 0, bGroupName.Length); } ProtoCommon.RecvPackageInfo pkgInfo = ProtoCommon.recvPackage(connection.getInputStream(), ProtoCommon.TRACKER_PROTO_CMD_RESP, -1); this.errno = pkgInfo.errno; if (pkgInfo.errno != 0) { return(null); } if (pkgInfo.body.Length < ProtoCommon.TRACKER_QUERY_STORAGE_STORE_BODY_LEN) { this.errno = ProtoCommon.ERR_NO_EINVAL; return(null); } int ipPortLen = pkgInfo.body.Length - (ProtoCommon.FDFS_GROUP_NAME_MAX_LEN + 1); const int recordLength = ProtoCommon.FDFS_IPADDR_SIZE - 1 + ProtoCommon.FDFS_PROTO_PKG_LEN_SIZE; if (ipPortLen % recordLength != 0) { this.errno = ProtoCommon.ERR_NO_EINVAL; return(null); } int serverCount = ipPortLen / recordLength; if (serverCount > 16) { this.errno = ProtoCommon.ERR_NO_ENOSPC; return(null); } StorageServer[] results = new StorageServer[serverCount]; byte store_path = pkgInfo.body[pkgInfo.body.Length - 1]; int offset = ProtoCommon.FDFS_GROUP_NAME_MAX_LEN; for (int i = 0; i < serverCount; i++) { ip_addr = Strings.Get(pkgInfo.body, offset, ProtoCommon.FDFS_IPADDR_SIZE - 1).Trim(); offset += ProtoCommon.FDFS_IPADDR_SIZE - 1; port = (int)ProtoCommon.buff2long(pkgInfo.body, offset); offset += ProtoCommon.FDFS_PROTO_PKG_LEN_SIZE; results[i] = new StorageServer(ip_addr, port, store_path); } return(results); } catch (IOException ex) { try { connection.close(); } catch (IOException ex1) { throw ex1; } finally { connection = null; } throw ex; } finally { if (connection != null) { try { connection.release(); } catch { } } } }