aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Engelbrecht <[email protected]>2022-12-08 14:44:14 +0100
committerGitHub <[email protected]>2022-12-08 05:44:14 -0800
commit85c411df89737c153528c1ef0d99305bd2e060de (patch)
tree437e90dbececb4609fb7984dd657d5488aab52f8
parentFix http parsing crash (#205) (diff)
downloadzen-85c411df89737c153528c1ef0d99305bd2e060de.tar.xz
zen-85c411df89737c153528c1ef0d99305bd2e060de.zip
Path from handle perf improvement (#206)
* Read recorded requests to memory before parsing This will more accurately simulate how requests comes in from a client * Make a fast path for GetFinalPathNameByHandleW Try to get the path with a fixes size buffer first to avoid always doing two calls to GetFinalPathNameByHandleW
-rw-r--r--zencore/filesystem.cpp12
-rw-r--r--zenserver/cache/structuredcache.cpp20
2 files changed, 22 insertions, 10 deletions
diff --git a/zencore/filesystem.cpp b/zencore/filesystem.cpp
index 1e4a52638..a2442a134 100644
--- a/zencore/filesystem.cpp
+++ b/zencore/filesystem.cpp
@@ -976,19 +976,27 @@ PathFromHandle(void* NativeHandle)
}
};
- DWORD RequiredLengthIncludingNul = GetFinalPathNameByHandleWRetry(NativeHandle, nullptr, 0, FILE_NAME_OPENED);
+ static const DWORD PathDataSize = 512;
+ wchar_t PathData[PathDataSize];
+ DWORD RequiredLengthIncludingNul = GetFinalPathNameByHandleWRetry(NativeHandle, PathData, PathDataSize, FILE_NAME_OPENED);
if (RequiredLengthIncludingNul == 0)
{
ThrowLastError(fmt::format("failed to get path from file handle {}", NativeHandle));
}
+ if (RequiredLengthIncludingNul < PathDataSize)
+ {
+ std::wstring FullPath(PathData, gsl::narrow<size_t>(RequiredLengthIncludingNul));
+ return FullPath;
+ }
+
std::wstring FullPath;
FullPath.resize(RequiredLengthIncludingNul - 1);
const DWORD FinalLength = GetFinalPathNameByHandleWRetry(NativeHandle, FullPath.data(), RequiredLengthIncludingNul, FILE_NAME_OPENED);
ZEN_UNUSED(FinalLength);
-
return FullPath;
+
#elif ZEN_PLATFORM_LINUX
char Link[PATH_MAX];
char Path[64];
diff --git a/zenserver/cache/structuredcache.cpp b/zenserver/cache/structuredcache.cpp
index f649efa01..a7571b4c4 100644
--- a/zenserver/cache/structuredcache.cpp
+++ b/zenserver/cache/structuredcache.cpp
@@ -149,14 +149,15 @@ namespace cache::detail {
}
}
uint32_t BlockCount = gsl::narrow<uint32_t>(MaxChunkPosition / RecordedRequestBlockSize) + 1;
- m_IoBuffers.resize(BlockCount);
+ m_BlockFiles.resize(BlockCount);
for (uint32_t BlockIndex = 0; BlockIndex < BlockCount; ++BlockIndex)
{
- m_IoBuffers[BlockIndex] = IoBufferBuilder::MakeFromFile(m_BasePath / fmt::format("chunks{}.bin", BlockIndex));
+ m_BlockFiles[BlockIndex] = std::make_unique<BasicFile>();
+ m_BlockFiles[BlockIndex]->Open(m_BasePath / fmt::format("chunks{}.bin", BlockIndex), BasicFile::Mode::kRead);
}
return m_Entries.size();
}
- void EndRead() { m_IoBuffers.clear(); }
+ void EndRead() { m_BlockFiles.clear(); }
ZenContentType ReadRequest(uint64_t RequestIndex, IoBuffer& OutBuffer) const
{
@@ -171,19 +172,22 @@ namespace cache::detail {
}
if (Entry.Offset != ~0ull)
{
- uint32_t BlockIndex = gsl::narrow<uint32_t>((Entry.Offset + Entry.Length) / RecordedRequestBlockSize);
- uint64_t ChunkOffset = Entry.Offset - (BlockIndex * RecordedRequestBlockSize);
- OutBuffer = IoBuffer(m_IoBuffers[BlockIndex], ChunkOffset, Entry.Length);
+ uint32_t BlockIndex = gsl::narrow<uint32_t>((Entry.Offset + Entry.Length) / RecordedRequestBlockSize);
+ uint64_t ChunkOffset = Entry.Offset - (BlockIndex * RecordedRequestBlockSize);
+ OutBuffer = IoBuffer(Entry.Length);
+ MutableMemoryView OutView = OutBuffer.GetMutableView();
+ m_BlockFiles[BlockIndex]->Read(OutView.GetData(), OutView.GetSize(), ChunkOffset);
return Entry.ContentType;
}
- OutBuffer = IoBufferBuilder::MakeFromFile(m_BasePath / fmt::format("request{}.bin", RequestIndex));
+ BasicFile ChunkFile;
+ ChunkFile.Open(m_BasePath / fmt::format("request{}.bin", RequestIndex), BasicFile::Mode::kRead);
+ OutBuffer = ChunkFile.ReadAll();
return Entry.ContentType;
}
std::filesystem::path m_BasePath;
std::vector<RecordedRequest> m_Entries;
std::vector<std::unique_ptr<BasicFile>> m_BlockFiles;
- std::vector<IoBuffer> m_IoBuffers;
};
class DiskRequestRecorder : public IRequestRecorder