/** * query storage server stat info of the group * * @param trackerServer the tracker server * @param groupName the group name of storage server * @param storageIpAddr the storage server ip address, can be null or empty * @return storage server stat array, return null if fail */ public StructStorageStat[] listStorages(TrackerServer trackerServer, String groupName, String storageIpAddr) { byte[] header; byte[] bGroupName; byte[] bs; int len; bool bNewConnection; Socket trackerSocket; if (trackerServer == null) { trackerServer = getConnection(); if (trackerServer == null) { return(null); } bNewConnection = true; } else { bNewConnection = false; } trackerSocket = trackerServer.getSocket(); var outputStream = new NetworkStream(trackerSocket); try { bs = _encoding.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; } bGroupName.Fill <byte>(0); Array.Copy(bs, 0, bGroupName, 0, len); int ipAddrLen; byte[] bIpAddr; if (storageIpAddr != null && storageIpAddr.Length > 0) { bIpAddr = _encoding.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); } outputStream.Write(wholePkg, 0, wholePkg.Length); ProtoCommon.RecvPackageInfo pkgInfo = ProtoCommon.recvPackage(outputStream, 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 <StructStorageStat>(pkgInfo.body, StructStorageStat.getFieldsTotalSize())); } catch (IOException ex) { if (!bNewConnection) { try { trackerServer.close(); } catch (IOException ex1) { } } throw ex; } catch (Exception ex) { this.errno = ProtoCommon.ERR_NO_EINVAL; return(null); } finally { outputStream.Close(); if (bNewConnection) { try { trackerServer.close(); } catch (IOException ex1) { } } } }
/** * list groups * * @param trackerServer the tracker server * @return group stat array, return null if fail */ public StructGroupStat[] listGroups(TrackerServer trackerServer) { byte[] header; String ip_addr; int port; byte cmd; int out_len; bool bNewConnection; byte store_path; Socket trackerSocket; if (trackerServer == null) { trackerServer = getConnection(); if (trackerServer == null) { return(null); } bNewConnection = true; } else { bNewConnection = false; } trackerSocket = trackerServer.getSocket(); var outputStream = new NetworkStream(trackerSocket); try { header = ProtoCommon.packHeader(ProtoCommon.TRACKER_PROTO_CMD_SERVER_LIST_GROUP, 0, (byte)0); outputStream.Write(header, 0, header.Length); ProtoCommon.RecvPackageInfo pkgInfo = ProtoCommon.recvPackage(outputStream, 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 <StructGroupStat>(pkgInfo.body, StructGroupStat.getFieldsTotalSize())); } catch (IOException ex) { if (!bNewConnection) { try { trackerServer.close(); } catch (IOException ex1) { } } throw ex; } catch (Exception ex) { this.errno = ProtoCommon.ERR_NO_EINVAL; return(null); } finally { outputStream.Close(); if (bNewConnection) { try { trackerServer.close(); } catch (IOException ex1) { } } } }