-
Notifications
You must be signed in to change notification settings - Fork 309
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-33586 fix double checked locking pattern in dali #19585
base: master
Are you sure you want to change the base?
HPCC-33586 fix double checked locking pattern in dali #19585
Conversation
Jira Issue: https://hpccsystems.atlassian.net//browse/HPCC-33586 Jirabot Action Result: |
192c358
to
9f6be12
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.
Copilot reviewed 1 out of 1 changed files in this pull request and generated no comments.
Change DFdir to be an atomic pointer for thread safety. Signed-off-by: Dave Streeter <[email protected]>
Change DFdir to be an atomic pointer for thread safety. Signed-off-by: Dave Streeter <[email protected]>
9f6be12
to
53ebcce
Compare
@@ -8239,20 +8239,22 @@ class CNamedGroupStore: implements INamedGroupStore, public CInterface | |||
|
|||
}; | |||
|
|||
static CNamedGroupStore *groupStore = NULL; | |||
static std::atomic<CNamedGroupStore *> groupStore{nullptr}; |
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.
There seems to be a mixture of fixes here. Either the variable should be atomic, or it should be accessed within a critical section. No need to do both.
dali/base/dadfs.cpp
Outdated
static CriticalSection groupsect; | ||
|
||
bool CNamedGroupIterator::match() | ||
{ | ||
if (conn.get()) { | ||
if (matchgroup.get()) { | ||
if (!groupStore) | ||
CLeavableCriticalBlock block3(groupsect); |
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 critical section will be held over the call to dolookup. That is likely to cause extra thread contention.
If you are worried about groupStore being destroyed, a more efficient solution is to copy and link it with the critical block, and then use the linked pointer. However, see note on closedownDFS() below - in which case it can never be freed.
@@ -9204,7 +9205,7 @@ GetFileClusterNamesType CDistributedFileDirectory::getFileClusterNames(const cha | |||
// -------------------------------------------------------- | |||
|
|||
|
|||
static CDistributedFileDirectory *DFdir = NULL; | |||
static std::atomic<CDistributedFileDirectory *> DFdir{nullptr}; |
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.
Similar comments to above - either make it atomic, or protect all access within a critical section.
@@ -9229,7 +9228,7 @@ void closedownDFS() // called by dacoven | |||
{ |
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.
Is closedownDFS() ever called - I don't think so. If not the function can be deleted, avoiding the lifetime problem above.
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.
Comment about closedownDFS() is inaccurate - I was only searching open documents, so missed the call. |
As per PR comments remove unnecessary CriticalSection Signed-off-by: Dave Streeter <[email protected]>
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.
Copilot reviewed 1 out of 1 changed files in this pull request and generated no comments.
if (e->errorCode()!=DCERR_server_closed) | ||
throw; | ||
e->Release(); | ||
if (groupStore.load()) |
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.
@ghalliday would it be safer to move up the groupStore
release before the DFdir delete
in case the DFdir delete
ends up throwing an exception? Or not bother?
Type of change:
Checklist:
Smoketest:
Testing: