-
Notifications
You must be signed in to change notification settings - Fork 304
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
HPCC-31968 Increase ECLWatch upload buffer size to 1MB #18721
HPCC-31968 Increase ECLWatch upload buffer size to 1MB #18721
Conversation
@ghalliday let me know if someone else is better suited to review. Tim is out or I would have asked him. |
Jira Issue: https://hpccsystems.atlassian.net//browse/HPCC-31968 Jirabot Action Result: |
fdcb624
to
f33a58d
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@asselitx see comments and suggestion. Please ask me if you have any questions.
@@ -2123,8 +2123,8 @@ int CHttpRequest::processHeaders(IMultiException *me) | |||
|
|||
bool CHttpRequest::readContentToBuffer(MemoryBuffer& buffer, __int64& bytesNotRead) | |||
{ | |||
char buf[1024 + 1]; | |||
__int64 buflen = 1024; | |||
char buf[1048576 + 1]; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Allocating 1MB on the stack could cause problems.
The function also has a couple of other problems:
- It is unnecessarily memcpy-ing the data - which adds up if the file is large.
- It is unnecessarily adding a null terminator onto the string that was read (which makes the code confusing).
Better is something like:
constexpr size32_t readChunkSize = 0x100000;
size32_t sizeToRead = bytesNotRead > readChunkSize ? readChunkSize: (size32_t)readChunkSize;
size32_t prevLen = buffer.length();
char * target = (char *)buffer.reserve(sizeToRead);
int readlen = m_bufferedsocket->read(target, sizeToRead);
if(readlen <= 0)
{
if(readlen < 0)
DBGLOG("Failed to read from socket");
buffer.setLength(prevLen);
return false;
}
buffer.setLength(prevLen + readlen);
bytesNotRead -= readlen;
return true;
(Untested). It reads the data directly into the buffer rather than copying it.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This makes sense, it is a much better solution. I'd completely missed the consideration of stack size and the reserve on the buffer is slick. I'm implementing this and testing.
In HttpTransport, update readContentToBuffer function to read up to 1MB chunks directly into the MemoryBuffer rather than into a temporary stack buffer. Former 1K size likely cause of slow uploads to cloud, if not increased cost in some cases. Subsequent ticket will use configured preferred size per landing zone. Signed-off-by: Terrence Asselin <[email protected]>
f33a58d
to
2f399ca
Compare
size32_t sizeToRead = bytesNotRead > readChunkSize ? readChunkSize: (size32_t)bytesNotRead; | ||
size32_t prevLen = buffer.length(); | ||
|
||
// BufferedSocket::read buffer must be at least one larger than its maxlen argument |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Well spotted (and that is a terrible interface!)
fea585e
into
hpcc-systems:candidate-9.6.x
Get a quick reasonable fix deployed. Former 1K size likely cause of slow uploads to cloud, if not increased cost in some cases. Subsequent ticket will use configured preferred size per landing zone.
Type of change:
Checklist:
Smoketest:
Testing:
Tested locally with instrumentation to confirm upload completes in fewer read/write cycles