writePackets sends one or some packets with compression. Use this instead of mc.netConn.Write() when mc.compress is true.
(packets []byte)
| 150 | // writePackets sends one or some packets with compression. |
| 151 | // Use this instead of mc.netConn.Write() when mc.compress is true. |
| 152 | func (c *compIO) writePackets(packets []byte) (int, error) { |
| 153 | totalBytes := len(packets) |
| 154 | blankHeader := make([]byte, 7) |
| 155 | buf := &c.buff |
| 156 | |
| 157 | for len(packets) > 0 { |
| 158 | payloadLen := min(maxPayloadLen, len(packets)) |
| 159 | payload := packets[:payloadLen] |
| 160 | uncompressedLen := payloadLen |
| 161 | |
| 162 | buf.Reset() |
| 163 | buf.Write(blankHeader) // Buffer.Write() never returns error |
| 164 | |
| 165 | // If payload is less than minCompressLength, don't compress. |
| 166 | if uncompressedLen < minCompressLength { |
| 167 | buf.Write(payload) |
| 168 | uncompressedLen = 0 |
| 169 | } else { |
| 170 | err := zCompress(payload, buf) |
| 171 | if debug && err != nil { |
| 172 | fmt.Printf("zCompress error: %v", err) |
| 173 | } |
| 174 | // do not compress if compressed data is larger than uncompressed data |
| 175 | // I intentionally miss 7 byte header in the buf; zCompress must compress more than 7 bytes. |
| 176 | if err != nil || buf.Len() >= uncompressedLen { |
| 177 | buf.Reset() |
| 178 | buf.Write(blankHeader) |
| 179 | buf.Write(payload) |
| 180 | uncompressedLen = 0 |
| 181 | } |
| 182 | } |
| 183 | |
| 184 | if n, err := c.writeCompressedPacket(buf.Bytes(), uncompressedLen); err != nil { |
| 185 | // To allow returning ErrBadConn when sending really 0 bytes, we sum |
| 186 | // up compressed bytes that is returned by underlying Write(). |
| 187 | return totalBytes - len(packets) + n, err |
| 188 | } |
| 189 | packets = packets[payloadLen:] |
| 190 | } |
| 191 | |
| 192 | return totalBytes, nil |
| 193 | } |
| 194 | |
| 195 | // writeCompressedPacket writes a compressed packet with header. |
| 196 | // data should start with 7 size space for header followed by payload. |
nothing calls this directly
no test coverage detected