Skip to content
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

storage: ignore non-intent locks in intentInterleavingIter #109570

Conversation

nvanbenschoten
Copy link
Member

@nvanbenschoten nvanbenschoten commented Aug 27, 2023

Informs #100193.
Closes #109644.

This commit updates the intentInterleavingIter to ignore locks in the lock table keyspace with strengths other than lock.Intent (i.e. shared and exclusive locks). Future versions of the iterator may expose information to users about whether any non-intent locks were observed and, if so, which keys they were found on. For now, no such information is exposed.

This change is needed for replicated locks. Non-locking reads will not interact with these locks at all, so we want the intentInterleavingIter to ignore them. Meanwhile, locking reads and writes will use a different abstraction to peek into the lock table and look for conflicts.

Benchmark delta without Locks
name                                                                     old time/op    new time/op    delta
IntentInterleavingIterNext/version=1/intentStride=100/keyLen=100-10         112ns ± 7%     111ns ± 4%    ~     (p=0.332 n=25+22)
IntentInterleavingIterNext/version=1/intentStride=1000000/keyLen=10-10     61.6ns ± 4%    61.1ns ± 2%    ~     (p=0.340 n=24+20)
IntentInterleavingIterNext/version=1/intentStride=1000000/keyLen=100-10    66.2ns ± 5%    66.1ns ± 4%    ~     (p=0.788 n=25+25)
IntentInterleavingIterNext/version=5/intentStride=1/keyLen=100-10           115ns ±10%     114ns ± 4%    ~     (p=0.367 n=25+25)
IntentInterleavingIterNext/version=5/intentStride=1000000/keyLen=10-10     58.9ns ± 4%    59.7ns ± 4%    ~     (p=0.051 n=21+25)
IntentInterleavingIterNext/version=5/intentStride=1000000/keyLen=100-10    63.7ns ± 3%    64.2ns ± 4%    ~     (p=0.100 n=24+25)
IntentInterleavingIterPrev/version=1/intentStride=100/keyLen=100-10         123ns ± 8%     124ns ± 4%    ~     (p=0.081 n=25+24)
IntentInterleavingIterNext/version=5/intentStride=100/keyLen=100-10         109ns ± 4%     110ns ± 4%  +0.81%  (p=0.002 n=24+24)
IntentInterleavingIterNext/version=5/intentStride=100/keyLen=10-10          100ns ± 4%     102ns ± 1%  +1.49%  (p=0.003 n=24+20)
IntentInterleavingIterPrev/version=5/intentStride=1/keyLen=10-10           84.9ns ± 4%    86.3ns ± 4%  +1.60%  (p=0.000 n=24+24)
IntentInterleavingIterPrev/version=1/intentStride=1000000/keyLen=100-10     122ns ± 6%     124ns ± 4%  +1.90%  (p=0.001 n=25+24)
IntentInterleavingIterPrev/version=5/intentStride=1000000/keyLen=100-10     123ns ± 4%     126ns ± 7%  +2.44%  (p=0.000 n=24+24)
IntentInterleavingIterNext/version=1/intentStride=100/keyLen=10-10          101ns ± 4%     104ns ± 5%  +2.46%  (p=0.000 n=25+24)
IntentInterleavingIterNext/version=5/intentStride=1/keyLen=10-10            103ns ± 6%     105ns ± 5%  +2.64%  (p=0.000 n=23+24)
IntentInterleavingIterPrev/version=5/intentStride=100/keyLen=100-10         122ns ± 3%     126ns ± 5%  +2.75%  (p=0.000 n=22+25)
IntentInterleavingIterPrev/version=5/intentStride=1/keyLen=100-10          92.0ns ± 2%    94.8ns ± 6%  +3.13%  (p=0.000 n=23+24)
IntentInterleavingIterPrev/version=1/intentStride=1000000/keyLen=10-10      112ns ± 4%     116ns ± 6%  +3.24%  (p=0.000 n=25+25)
IntentInterleavingIterPrev/version=1/intentStride=100/keyLen=10-10          112ns ± 5%     116ns ± 4%  +3.36%  (p=0.000 n=25+25)
IntentInterleavingIterPrev/version=5/intentStride=100/keyLen=10-10          112ns ± 3%     116ns ± 4%  +3.65%  (p=0.000 n=25+25)
IntentInterleavingIterNext/version=1/intentStride=1/keyLen=100-10           112ns ± 8%     117ns ± 1%  +3.83%  (p=0.000 n=25+20)
IntentInterleavingIterPrev/version=5/intentStride=1000000/keyLen=10-10      111ns ± 2%     116ns ± 3%  +4.02%  (p=0.000 n=21+24)
IntentInterleavingIterNext/version=1/intentStride=1/keyLen=10-10            103ns ± 4%     107ns ± 3%  +4.07%  (p=0.000 n=25+21)
IntentInterleavingIterPrev/version=1/intentStride=1/keyLen=100-10           105ns ± 3%     111ns ± 6%  +6.23%  (p=0.000 n=24+25)
IntentInterleavingIterPrev/version=1/intentStride=1/keyLen=10-10           94.4ns ± 3%   100.5ns ± 5%  +6.48%  (p=0.000 n=23+25)

name                                                                     old alloc/op   new alloc/op   delta
IntentInterleavingIterNext/version=1/intentStride=1/keyLen=10-10            0.00B          0.00B         ~     (all equal)
IntentInterleavingIterNext/version=1/intentStride=1/keyLen=100-10           0.00B          0.00B         ~     (all equal)
IntentInterleavingIterNext/version=1/intentStride=100/keyLen=10-10          0.00B          0.00B         ~     (all equal)
IntentInterleavingIterNext/version=1/intentStride=100/keyLen=100-10         0.00B          0.00B         ~     (all equal)
IntentInterleavingIterNext/version=1/intentStride=1000000/keyLen=10-10      0.00B          0.00B         ~     (all equal)
IntentInterleavingIterNext/version=1/intentStride=1000000/keyLen=100-10     0.00B          0.00B         ~     (all equal)
IntentInterleavingIterNext/version=5/intentStride=1/keyLen=10-10            0.00B          0.00B         ~     (all equal)
IntentInterleavingIterNext/version=5/intentStride=1/keyLen=100-10           0.00B          0.00B         ~     (all equal)
IntentInterleavingIterNext/version=5/intentStride=100/keyLen=10-10          0.00B          0.00B         ~     (all equal)
IntentInterleavingIterNext/version=5/intentStride=100/keyLen=100-10         0.00B          0.00B         ~     (all equal)
IntentInterleavingIterNext/version=5/intentStride=1000000/keyLen=10-10      0.00B          0.00B         ~     (all equal)
IntentInterleavingIterNext/version=5/intentStride=1000000/keyLen=100-10     0.00B          0.00B         ~     (all equal)
IntentInterleavingIterPrev/version=1/intentStride=1/keyLen=10-10            0.00B          0.00B         ~     (all equal)
IntentInterleavingIterPrev/version=1/intentStride=1/keyLen=100-10           0.00B          0.00B         ~     (all equal)
IntentInterleavingIterPrev/version=1/intentStride=100/keyLen=10-10          0.00B          0.00B         ~     (all equal)
IntentInterleavingIterPrev/version=1/intentStride=100/keyLen=100-10         0.00B          0.00B         ~     (all equal)
IntentInterleavingIterPrev/version=1/intentStride=1000000/keyLen=10-10      0.00B          0.00B         ~     (all equal)
IntentInterleavingIterPrev/version=1/intentStride=1000000/keyLen=100-10     0.00B          0.00B         ~     (all equal)
IntentInterleavingIterPrev/version=5/intentStride=1/keyLen=10-10            0.00B          0.00B         ~     (all equal)
IntentInterleavingIterPrev/version=5/intentStride=1/keyLen=100-10           0.00B          0.00B         ~     (all equal)
IntentInterleavingIterPrev/version=5/intentStride=100/keyLen=10-10          0.00B          0.00B         ~     (all equal)
IntentInterleavingIterPrev/version=5/intentStride=100/keyLen=100-10         0.00B          0.00B         ~     (all equal)
IntentInterleavingIterPrev/version=5/intentStride=1000000/keyLen=10-10      0.00B          0.00B         ~     (all equal)
IntentInterleavingIterPrev/version=5/intentStride=1000000/keyLen=100-10     0.00B          0.00B         ~     (all equal)

name                                                                     old allocs/op  new allocs/op  delta
IntentInterleavingIterNext/version=1/intentStride=1/keyLen=10-10             0.00           0.00         ~     (all equal)
IntentInterleavingIterNext/version=1/intentStride=1/keyLen=100-10            0.00           0.00         ~     (all equal)
IntentInterleavingIterNext/version=1/intentStride=100/keyLen=10-10           0.00           0.00         ~     (all equal)
IntentInterleavingIterNext/version=1/intentStride=100/keyLen=100-10          0.00           0.00         ~     (all equal)
IntentInterleavingIterNext/version=1/intentStride=1000000/keyLen=10-10       0.00           0.00         ~     (all equal)
IntentInterleavingIterNext/version=1/intentStride=1000000/keyLen=100-10      0.00           0.00         ~     (all equal)
IntentInterleavingIterNext/version=5/intentStride=1/keyLen=10-10             0.00           0.00         ~     (all equal)
IntentInterleavingIterNext/version=5/intentStride=1/keyLen=100-10            0.00           0.00         ~     (all equal)
IntentInterleavingIterNext/version=5/intentStride=100/keyLen=10-10           0.00           0.00         ~     (all equal)
IntentInterleavingIterNext/version=5/intentStride=100/keyLen=100-10          0.00           0.00         ~     (all equal)
IntentInterleavingIterNext/version=5/intentStride=1000000/keyLen=10-10       0.00           0.00         ~     (all equal)
IntentInterleavingIterNext/version=5/intentStride=1000000/keyLen=100-10      0.00           0.00         ~     (all equal)
IntentInterleavingIterPrev/version=1/intentStride=1/keyLen=10-10             0.00           0.00         ~     (all equal)
IntentInterleavingIterPrev/version=1/intentStride=1/keyLen=100-10            0.00           0.00         ~     (all equal)
IntentInterleavingIterPrev/version=1/intentStride=100/keyLen=10-10           0.00           0.00         ~     (all equal)
IntentInterleavingIterPrev/version=1/intentStride=100/keyLen=100-10          0.00           0.00         ~     (all equal)
IntentInterleavingIterPrev/version=1/intentStride=1000000/keyLen=10-10       0.00           0.00         ~     (all equal)
IntentInterleavingIterPrev/version=1/intentStride=1000000/keyLen=100-10      0.00           0.00         ~     (all equal)
IntentInterleavingIterPrev/version=5/intentStride=1/keyLen=10-10             0.00           0.00         ~     (all equal)
IntentInterleavingIterPrev/version=5/intentStride=1/keyLen=100-10            0.00           0.00         ~     (all equal)
IntentInterleavingIterPrev/version=5/intentStride=100/keyLen=10-10           0.00           0.00         ~     (all equal)
IntentInterleavingIterPrev/version=5/intentStride=100/keyLen=100-10          0.00           0.00         ~     (all equal)
IntentInterleavingIterPrev/version=5/intentStride=1000000/keyLen=10-10       0.00           0.00         ~     (all equal)
IntentInterleavingIterPrev/version=5/intentStride=1000000/keyLen=100-10      0.00           0.00         ~     (all equal)
Benchmarks with Locks
name                                                                                        time/op
IntentInterleavingIterNext/version=1/intentStride=1/lockStride=1/keyLen=10-10                149ns ± 1%
IntentInterleavingIterNext/version=1/intentStride=1/lockStride=1/keyLen=100-10               161ns ± 1%
IntentInterleavingIterNext/version=1/intentStride=1/lockStride=100/keyLen=10-10              105ns ± 0%
IntentInterleavingIterNext/version=1/intentStride=1/lockStride=100/keyLen=100-10             113ns ± 1%
IntentInterleavingIterNext/version=1/intentStride=1/lockStride=1000000/keyLen=10-10          104ns ± 1%
IntentInterleavingIterNext/version=1/intentStride=1/lockStride=1000000/keyLen=100-10         112ns ± 1%
IntentInterleavingIterNext/version=1/intentStride=100/lockStride=1/keyLen=10-10              173ns ± 2%
IntentInterleavingIterNext/version=1/intentStride=100/lockStride=1/keyLen=100-10             187ns ± 1%
IntentInterleavingIterNext/version=1/intentStride=100/lockStride=100/keyLen=10-10           94.3ns ± 1%
IntentInterleavingIterNext/version=1/intentStride=100/lockStride=100/keyLen=100-10           102ns ± 1%
IntentInterleavingIterNext/version=1/intentStride=100/lockStride=1000000/keyLen=10-10       93.0ns ± 1%
IntentInterleavingIterNext/version=1/intentStride=100/lockStride=1000000/keyLen=100-10       100ns ± 1%
IntentInterleavingIterNext/version=1/intentStride=1000000/lockStride=1/keyLen=10-10          172ns ± 1%
IntentInterleavingIterNext/version=1/intentStride=1000000/lockStride=1/keyLen=100-10         188ns ± 1%
IntentInterleavingIterNext/version=1/intentStride=1000000/lockStride=100/keyLen=10-10       93.6ns ± 1%
IntentInterleavingIterNext/version=1/intentStride=1000000/lockStride=100/keyLen=100-10       101ns ± 1%
IntentInterleavingIterNext/version=1/intentStride=1000000/lockStride=1000000/keyLen=10-10   54.1ns ± 1%
IntentInterleavingIterNext/version=1/intentStride=1000000/lockStride=1000000/keyLen=100-10  58.8ns ± 1%
IntentInterleavingIterNext/version=5/intentStride=1/lockStride=1/keyLen=10-10                112ns ± 0%
IntentInterleavingIterNext/version=5/intentStride=1/lockStride=1/keyLen=100-10               121ns ± 1%
IntentInterleavingIterNext/version=5/intentStride=1/lockStride=100/keyLen=10-10             96.6ns ± 1%
IntentInterleavingIterNext/version=5/intentStride=1/lockStride=100/keyLen=100-10             105ns ± 1%
IntentInterleavingIterNext/version=5/intentStride=1/lockStride=1000000/keyLen=10-10         96.6ns ± 1%
IntentInterleavingIterNext/version=5/intentStride=1/lockStride=1000000/keyLen=100-10         104ns ± 0%
IntentInterleavingIterNext/version=5/intentStride=100/lockStride=1/keyLen=10-10              108ns ± 1%
IntentInterleavingIterNext/version=5/intentStride=100/lockStride=1/keyLen=100-10             118ns ± 0%
IntentInterleavingIterNext/version=5/intentStride=100/lockStride=100/keyLen=10-10           91.5ns ± 1%
IntentInterleavingIterNext/version=5/intentStride=100/lockStride=100/keyLen=100-10          98.6ns ± 0%
IntentInterleavingIterNext/version=5/intentStride=100/lockStride=1000000/keyLen=10-10       91.2ns ± 1%
IntentInterleavingIterNext/version=5/intentStride=100/lockStride=1000000/keyLen=100-10      98.5ns ± 1%
IntentInterleavingIterNext/version=5/intentStride=1000000/lockStride=1/keyLen=10-10          108ns ± 1%
IntentInterleavingIterNext/version=5/intentStride=1000000/lockStride=1/keyLen=100-10         118ns ± 0%
IntentInterleavingIterNext/version=5/intentStride=1000000/lockStride=100/keyLen=10-10       91.6ns ± 1%
IntentInterleavingIterNext/version=5/intentStride=1000000/lockStride=100/keyLen=100-10      98.9ns ± 1%
IntentInterleavingIterNext/version=5/intentStride=1000000/lockStride=1000000/keyLen=10-10   51.6ns ± 0%
IntentInterleavingIterNext/version=5/intentStride=1000000/lockStride=1000000/keyLen=100-10  56.5ns ± 2%
IntentInterleavingIterPrev/version=1/intentStride=1/lockStride=1/keyLen=10-10                149ns ± 1%
IntentInterleavingIterPrev/version=1/intentStride=1/lockStride=1/keyLen=100-10               159ns ± 1%
IntentInterleavingIterPrev/version=1/intentStride=1/lockStride=100/keyLen=10-10             96.7ns ± 1%
IntentInterleavingIterPrev/version=1/intentStride=1/lockStride=100/keyLen=100-10             105ns ± 5%
IntentInterleavingIterPrev/version=1/intentStride=1/lockStride=1000000/keyLen=10-10         94.2ns ± 0%
IntentInterleavingIterPrev/version=1/intentStride=1/lockStride=1000000/keyLen=100-10         103ns ± 0%
IntentInterleavingIterPrev/version=1/intentStride=100/lockStride=1/keyLen=10-10              190ns ± 0%
IntentInterleavingIterPrev/version=1/intentStride=100/lockStride=1/keyLen=100-10             207ns ± 0%
IntentInterleavingIterPrev/version=1/intentStride=100/lockStride=100/keyLen=10-10            103ns ± 1%
IntentInterleavingIterPrev/version=1/intentStride=100/lockStride=100/keyLen=100-10           111ns ± 1%
IntentInterleavingIterPrev/version=1/intentStride=100/lockStride=1000000/keyLen=10-10        102ns ± 1%
IntentInterleavingIterPrev/version=1/intentStride=100/lockStride=1000000/keyLen=100-10       110ns ± 1%
IntentInterleavingIterPrev/version=1/intentStride=1000000/lockStride=1/keyLen=10-10          190ns ± 0%
IntentInterleavingIterPrev/version=1/intentStride=1000000/lockStride=1/keyLen=100-10         207ns ± 0%
IntentInterleavingIterPrev/version=1/intentStride=1000000/lockStride=100/keyLen=10-10        102ns ± 1%
IntentInterleavingIterPrev/version=1/intentStride=1000000/lockStride=100/keyLen=100-10       111ns ± 1%
IntentInterleavingIterPrev/version=1/intentStride=1000000/lockStride=1000000/keyLen=10-10    101ns ± 0%
IntentInterleavingIterPrev/version=1/intentStride=1000000/lockStride=1000000/keyLen=100-10   110ns ± 1%
IntentInterleavingIterPrev/version=5/intentStride=1/lockStride=1/keyLen=10-10               94.7ns ± 0%
IntentInterleavingIterPrev/version=5/intentStride=1/lockStride=1/keyLen=100-10               103ns ± 1%
IntentInterleavingIterPrev/version=5/intentStride=1/lockStride=100/keyLen=10-10             77.8ns ± 1%
IntentInterleavingIterPrev/version=5/intentStride=1/lockStride=100/keyLen=100-10            86.4ns ± 1%
IntentInterleavingIterPrev/version=5/intentStride=1/lockStride=1000000/keyLen=10-10         78.5ns ± 0%
IntentInterleavingIterPrev/version=5/intentStride=1/lockStride=1000000/keyLen=100-10        86.3ns ± 0%
IntentInterleavingIterPrev/version=5/intentStride=100/lockStride=1/keyLen=10-10              123ns ± 0%
IntentInterleavingIterPrev/version=5/intentStride=100/lockStride=1/keyLen=100-10             135ns ± 1%
IntentInterleavingIterPrev/version=5/intentStride=100/lockStride=100/keyLen=10-10            103ns ± 2%
IntentInterleavingIterPrev/version=5/intentStride=100/lockStride=100/keyLen=100-10           111ns ± 0%
IntentInterleavingIterPrev/version=5/intentStride=100/lockStride=1000000/keyLen=10-10        102ns ± 1%
IntentInterleavingIterPrev/version=5/intentStride=100/lockStride=1000000/keyLen=100-10       111ns ± 1%
IntentInterleavingIterPrev/version=5/intentStride=1000000/lockStride=1/keyLen=10-10          121ns ± 0%
IntentInterleavingIterPrev/version=5/intentStride=1000000/lockStride=1/keyLen=100-10         133ns ± 2%
IntentInterleavingIterPrev/version=5/intentStride=1000000/lockStride=100/keyLen=10-10        102ns ± 0%
IntentInterleavingIterPrev/version=5/intentStride=1000000/lockStride=100/keyLen=100-10       112ns ± 1%
IntentInterleavingIterPrev/version=5/intentStride=1000000/lockStride=1000000/keyLen=10-10    102ns ± 0%
IntentInterleavingIterPrev/version=5/intentStride=1000000/lockStride=1000000/keyLen=100-10   111ns ± 0%

name                                                                                        alloc/op
IntentInterleavingIterNext/version=1/intentStride=1/lockStride=1/keyLen=10-10                0.00B
IntentInterleavingIterNext/version=1/intentStride=1/lockStride=1/keyLen=100-10               0.00B
IntentInterleavingIterNext/version=1/intentStride=1/lockStride=100/keyLen=10-10              0.00B
IntentInterleavingIterNext/version=1/intentStride=1/lockStride=100/keyLen=100-10             0.00B
IntentInterleavingIterNext/version=1/intentStride=1/lockStride=1000000/keyLen=10-10          0.00B
IntentInterleavingIterNext/version=1/intentStride=1/lockStride=1000000/keyLen=100-10         0.00B
IntentInterleavingIterNext/version=1/intentStride=100/lockStride=1/keyLen=10-10              0.00B
IntentInterleavingIterNext/version=1/intentStride=100/lockStride=1/keyLen=100-10             0.00B
IntentInterleavingIterNext/version=1/intentStride=100/lockStride=100/keyLen=10-10            0.00B
IntentInterleavingIterNext/version=1/intentStride=100/lockStride=100/keyLen=100-10           0.00B
IntentInterleavingIterNext/version=1/intentStride=100/lockStride=1000000/keyLen=10-10        0.00B
IntentInterleavingIterNext/version=1/intentStride=100/lockStride=1000000/keyLen=100-10       0.00B
IntentInterleavingIterNext/version=1/intentStride=1000000/lockStride=1/keyLen=10-10          0.00B
IntentInterleavingIterNext/version=1/intentStride=1000000/lockStride=1/keyLen=100-10         0.00B
IntentInterleavingIterNext/version=1/intentStride=1000000/lockStride=100/keyLen=10-10        0.00B
IntentInterleavingIterNext/version=1/intentStride=1000000/lockStride=100/keyLen=100-10       0.00B
IntentInterleavingIterNext/version=1/intentStride=1000000/lockStride=1000000/keyLen=10-10    0.00B
IntentInterleavingIterNext/version=1/intentStride=1000000/lockStride=1000000/keyLen=100-10   0.00B
IntentInterleavingIterNext/version=5/intentStride=1/lockStride=1/keyLen=10-10                0.00B
IntentInterleavingIterNext/version=5/intentStride=1/lockStride=1/keyLen=100-10               0.00B
IntentInterleavingIterNext/version=5/intentStride=1/lockStride=100/keyLen=10-10              0.00B
IntentInterleavingIterNext/version=5/intentStride=1/lockStride=100/keyLen=100-10             0.00B
IntentInterleavingIterNext/version=5/intentStride=1/lockStride=1000000/keyLen=10-10          0.00B
IntentInterleavingIterNext/version=5/intentStride=1/lockStride=1000000/keyLen=100-10         0.00B
IntentInterleavingIterNext/version=5/intentStride=100/lockStride=1/keyLen=10-10              0.00B
IntentInterleavingIterNext/version=5/intentStride=100/lockStride=1/keyLen=100-10             0.00B
IntentInterleavingIterNext/version=5/intentStride=100/lockStride=100/keyLen=10-10            0.00B
IntentInterleavingIterNext/version=5/intentStride=100/lockStride=100/keyLen=100-10           0.00B
IntentInterleavingIterNext/version=5/intentStride=100/lockStride=1000000/keyLen=10-10        0.00B
IntentInterleavingIterNext/version=5/intentStride=100/lockStride=1000000/keyLen=100-10       0.00B
IntentInterleavingIterNext/version=5/intentStride=1000000/lockStride=1/keyLen=10-10          0.00B
IntentInterleavingIterNext/version=5/intentStride=1000000/lockStride=1/keyLen=100-10         0.00B
IntentInterleavingIterNext/version=5/intentStride=1000000/lockStride=100/keyLen=10-10        0.00B
IntentInterleavingIterNext/version=5/intentStride=1000000/lockStride=100/keyLen=100-10       0.00B
IntentInterleavingIterNext/version=5/intentStride=1000000/lockStride=1000000/keyLen=10-10    0.00B
IntentInterleavingIterNext/version=5/intentStride=1000000/lockStride=1000000/keyLen=100-10   0.00B
IntentInterleavingIterPrev/version=1/intentStride=1/lockStride=1/keyLen=10-10                0.00B
IntentInterleavingIterPrev/version=1/intentStride=1/lockStride=1/keyLen=100-10               0.00B
IntentInterleavingIterPrev/version=1/intentStride=1/lockStride=100/keyLen=10-10              0.00B
IntentInterleavingIterPrev/version=1/intentStride=1/lockStride=100/keyLen=100-10             0.00B
IntentInterleavingIterPrev/version=1/intentStride=1/lockStride=1000000/keyLen=10-10          0.00B
IntentInterleavingIterPrev/version=1/intentStride=1/lockStride=1000000/keyLen=100-10         0.00B
IntentInterleavingIterPrev/version=1/intentStride=100/lockStride=1/keyLen=10-10              0.00B
IntentInterleavingIterPrev/version=1/intentStride=100/lockStride=1/keyLen=100-10             0.00B
IntentInterleavingIterPrev/version=1/intentStride=100/lockStride=100/keyLen=10-10            0.00B
IntentInterleavingIterPrev/version=1/intentStride=100/lockStride=100/keyLen=100-10           0.00B
IntentInterleavingIterPrev/version=1/intentStride=100/lockStride=1000000/keyLen=10-10        0.00B
IntentInterleavingIterPrev/version=1/intentStride=100/lockStride=1000000/keyLen=100-10       0.00B
IntentInterleavingIterPrev/version=1/intentStride=1000000/lockStride=1/keyLen=10-10          0.00B
IntentInterleavingIterPrev/version=1/intentStride=1000000/lockStride=1/keyLen=100-10         0.00B
IntentInterleavingIterPrev/version=1/intentStride=1000000/lockStride=100/keyLen=10-10        0.00B
IntentInterleavingIterPrev/version=1/intentStride=1000000/lockStride=100/keyLen=100-10       0.00B
IntentInterleavingIterPrev/version=1/intentStride=1000000/lockStride=1000000/keyLen=10-10    0.00B
IntentInterleavingIterPrev/version=1/intentStride=1000000/lockStride=1000000/keyLen=100-10   0.00B
IntentInterleavingIterPrev/version=5/intentStride=1/lockStride=1/keyLen=10-10                0.00B
IntentInterleavingIterPrev/version=5/intentStride=1/lockStride=1/keyLen=100-10               0.00B
IntentInterleavingIterPrev/version=5/intentStride=1/lockStride=100/keyLen=10-10              0.00B
IntentInterleavingIterPrev/version=5/intentStride=1/lockStride=100/keyLen=100-10             0.00B
IntentInterleavingIterPrev/version=5/intentStride=1/lockStride=1000000/keyLen=10-10          0.00B
IntentInterleavingIterPrev/version=5/intentStride=1/lockStride=1000000/keyLen=100-10         0.00B
IntentInterleavingIterPrev/version=5/intentStride=100/lockStride=1/keyLen=10-10              0.00B
IntentInterleavingIterPrev/version=5/intentStride=100/lockStride=1/keyLen=100-10             0.00B
IntentInterleavingIterPrev/version=5/intentStride=100/lockStride=100/keyLen=10-10            0.00B
IntentInterleavingIterPrev/version=5/intentStride=100/lockStride=100/keyLen=100-10           0.00B
IntentInterleavingIterPrev/version=5/intentStride=100/lockStride=1000000/keyLen=10-10        0.00B
IntentInterleavingIterPrev/version=5/intentStride=100/lockStride=1000000/keyLen=100-10       0.00B
IntentInterleavingIterPrev/version=5/intentStride=1000000/lockStride=1/keyLen=10-10          0.00B
IntentInterleavingIterPrev/version=5/intentStride=1000000/lockStride=1/keyLen=100-10         0.00B
IntentInterleavingIterPrev/version=5/intentStride=1000000/lockStride=100/keyLen=10-10        0.00B
IntentInterleavingIterPrev/version=5/intentStride=1000000/lockStride=100/keyLen=100-10       0.00B
IntentInterleavingIterPrev/version=5/intentStride=1000000/lockStride=1000000/keyLen=10-10    0.00B
IntentInterleavingIterPrev/version=5/intentStride=1000000/lockStride=1000000/keyLen=100-10   0.00B

name                                                                                        allocs/op
IntentInterleavingIterNext/version=1/intentStride=1/lockStride=1/keyLen=10-10                 0.00
IntentInterleavingIterNext/version=1/intentStride=1/lockStride=1/keyLen=100-10                0.00
IntentInterleavingIterNext/version=1/intentStride=1/lockStride=100/keyLen=10-10               0.00
IntentInterleavingIterNext/version=1/intentStride=1/lockStride=100/keyLen=100-10              0.00
IntentInterleavingIterNext/version=1/intentStride=1/lockStride=1000000/keyLen=10-10           0.00
IntentInterleavingIterNext/version=1/intentStride=1/lockStride=1000000/keyLen=100-10          0.00
IntentInterleavingIterNext/version=1/intentStride=100/lockStride=1/keyLen=10-10               0.00
IntentInterleavingIterNext/version=1/intentStride=100/lockStride=1/keyLen=100-10              0.00
IntentInterleavingIterNext/version=1/intentStride=100/lockStride=100/keyLen=10-10             0.00
IntentInterleavingIterNext/version=1/intentStride=100/lockStride=100/keyLen=100-10            0.00
IntentInterleavingIterNext/version=1/intentStride=100/lockStride=1000000/keyLen=10-10         0.00
IntentInterleavingIterNext/version=1/intentStride=100/lockStride=1000000/keyLen=100-10        0.00
IntentInterleavingIterNext/version=1/intentStride=1000000/lockStride=1/keyLen=10-10           0.00
IntentInterleavingIterNext/version=1/intentStride=1000000/lockStride=1/keyLen=100-10          0.00
IntentInterleavingIterNext/version=1/intentStride=1000000/lockStride=100/keyLen=10-10         0.00
IntentInterleavingIterNext/version=1/intentStride=1000000/lockStride=100/keyLen=100-10        0.00
IntentInterleavingIterNext/version=1/intentStride=1000000/lockStride=1000000/keyLen=10-10     0.00
IntentInterleavingIterNext/version=1/intentStride=1000000/lockStride=1000000/keyLen=100-10    0.00
IntentInterleavingIterNext/version=5/intentStride=1/lockStride=1/keyLen=10-10                 0.00
IntentInterleavingIterNext/version=5/intentStride=1/lockStride=1/keyLen=100-10                0.00
IntentInterleavingIterNext/version=5/intentStride=1/lockStride=100/keyLen=10-10               0.00
IntentInterleavingIterNext/version=5/intentStride=1/lockStride=100/keyLen=100-10              0.00
IntentInterleavingIterNext/version=5/intentStride=1/lockStride=1000000/keyLen=10-10           0.00
IntentInterleavingIterNext/version=5/intentStride=1/lockStride=1000000/keyLen=100-10          0.00
IntentInterleavingIterNext/version=5/intentStride=100/lockStride=1/keyLen=10-10               0.00
IntentInterleavingIterNext/version=5/intentStride=100/lockStride=1/keyLen=100-10              0.00
IntentInterleavingIterNext/version=5/intentStride=100/lockStride=100/keyLen=10-10             0.00
IntentInterleavingIterNext/version=5/intentStride=100/lockStride=100/keyLen=100-10            0.00
IntentInterleavingIterNext/version=5/intentStride=100/lockStride=1000000/keyLen=10-10         0.00
IntentInterleavingIterNext/version=5/intentStride=100/lockStride=1000000/keyLen=100-10        0.00
IntentInterleavingIterNext/version=5/intentStride=1000000/lockStride=1/keyLen=10-10           0.00
IntentInterleavingIterNext/version=5/intentStride=1000000/lockStride=1/keyLen=100-10          0.00
IntentInterleavingIterNext/version=5/intentStride=1000000/lockStride=100/keyLen=10-10         0.00
IntentInterleavingIterNext/version=5/intentStride=1000000/lockStride=100/keyLen=100-10        0.00
IntentInterleavingIterNext/version=5/intentStride=1000000/lockStride=1000000/keyLen=10-10     0.00
IntentInterleavingIterNext/version=5/intentStride=1000000/lockStride=1000000/keyLen=100-10    0.00
IntentInterleavingIterPrev/version=1/intentStride=1/lockStride=1/keyLen=10-10                 0.00
IntentInterleavingIterPrev/version=1/intentStride=1/lockStride=1/keyLen=100-10                0.00
IntentInterleavingIterPrev/version=1/intentStride=1/lockStride=100/keyLen=10-10               0.00
IntentInterleavingIterPrev/version=1/intentStride=1/lockStride=100/keyLen=100-10              0.00
IntentInterleavingIterPrev/version=1/intentStride=1/lockStride=1000000/keyLen=10-10           0.00
IntentInterleavingIterPrev/version=1/intentStride=1/lockStride=1000000/keyLen=100-10          0.00
IntentInterleavingIterPrev/version=1/intentStride=100/lockStride=1/keyLen=10-10               0.00
IntentInterleavingIterPrev/version=1/intentStride=100/lockStride=1/keyLen=100-10              0.00
IntentInterleavingIterPrev/version=1/intentStride=100/lockStride=100/keyLen=10-10             0.00
IntentInterleavingIterPrev/version=1/intentStride=100/lockStride=100/keyLen=100-10            0.00
IntentInterleavingIterPrev/version=1/intentStride=100/lockStride=1000000/keyLen=10-10         0.00
IntentInterleavingIterPrev/version=1/intentStride=100/lockStride=1000000/keyLen=100-10        0.00
IntentInterleavingIterPrev/version=1/intentStride=1000000/lockStride=1/keyLen=10-10           0.00
IntentInterleavingIterPrev/version=1/intentStride=1000000/lockStride=1/keyLen=100-10          0.00
IntentInterleavingIterPrev/version=1/intentStride=1000000/lockStride=100/keyLen=10-10         0.00
IntentInterleavingIterPrev/version=1/intentStride=1000000/lockStride=100/keyLen=100-10        0.00
IntentInterleavingIterPrev/version=1/intentStride=1000000/lockStride=1000000/keyLen=10-10     0.00
IntentInterleavingIterPrev/version=1/intentStride=1000000/lockStride=1000000/keyLen=100-10    0.00
IntentInterleavingIterPrev/version=5/intentStride=1/lockStride=1/keyLen=10-10                 0.00
IntentInterleavingIterPrev/version=5/intentStride=1/lockStride=1/keyLen=100-10                0.00
IntentInterleavingIterPrev/version=5/intentStride=1/lockStride=100/keyLen=10-10               0.00
IntentInterleavingIterPrev/version=5/intentStride=1/lockStride=100/keyLen=100-10              0.00
IntentInterleavingIterPrev/version=5/intentStride=1/lockStride=1000000/keyLen=10-10           0.00
IntentInterleavingIterPrev/version=5/intentStride=1/lockStride=1000000/keyLen=100-10          0.00
IntentInterleavingIterPrev/version=5/intentStride=100/lockStride=1/keyLen=10-10               0.00
IntentInterleavingIterPrev/version=5/intentStride=100/lockStride=1/keyLen=100-10              0.00
IntentInterleavingIterPrev/version=5/intentStride=100/lockStride=100/keyLen=10-10             0.00
IntentInterleavingIterPrev/version=5/intentStride=100/lockStride=100/keyLen=100-10            0.00
IntentInterleavingIterPrev/version=5/intentStride=100/lockStride=1000000/keyLen=10-10         0.00
IntentInterleavingIterPrev/version=5/intentStride=100/lockStride=1000000/keyLen=100-10        0.00
IntentInterleavingIterPrev/version=5/intentStride=1000000/lockStride=1/keyLen=10-10           0.00
IntentInterleavingIterPrev/version=5/intentStride=1000000/lockStride=1/keyLen=100-10          0.00
IntentInterleavingIterPrev/version=5/intentStride=1000000/lockStride=100/keyLen=10-10         0.00
IntentInterleavingIterPrev/version=5/intentStride=1000000/lockStride=100/keyLen=100-10        0.00
IntentInterleavingIterPrev/version=5/intentStride=1000000/lockStride=1000000/keyLen=10-10     0.00
IntentInterleavingIterPrev/version=5/intentStride=1000000/lockStride=1000000/keyLen=100-10    0.00

Release note: None

@nvanbenschoten nvanbenschoten requested a review from a team as a code owner August 27, 2023 18:36
@cockroach-teamcity
Copy link
Member

This change is Reviewable

Copy link
Collaborator

@arulajmani arulajmani left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

:lgtm: modulo comments

Reviewed 1 of 1 files at r1, 5 of 5 files at r2, all commit messages.
Reviewable status: :shipit: complete! 1 of 0 LGTMs obtained (waiting on @nvanbenschoten and @sumeerbhola)


pkg/storage/intent_interleaving_iter.go line 716 at r2 (raw file):

// seeks intentIter to the first intent key equal to (if i.dir > 0) or after
// seekKey and decodes it into i.intentKey.
func (i *intentInterleavingIter) seekIntentIterAndDecodeLockKey(

nit: seekIntentIterAndDecodeLockKey seeks ...


pkg/storage/intent_interleaving_iter.go line 719 at r2 (raw file):

	seekKey EngineKey, limitKey roachpb.Key,
) (iterState pebble.IterValidityState, err error) {
	if i.dir < 0 {

I see we do this elsewhere, so feel free to disregard to keep things uniform, but would this logic be better expressed as:

switch i.dir {  
case 1:  
 iterState, err = i.intentIter.SeekEngineKeyGEWithLimit(seekKey, limitKey)  
case -1:  
 iterState, err = i.intentIter.SeekEngineKeyLTWithLimit(seekKey, limitKey)  
default:  
 return iterState, errors.AssertionFailedf(" ... ")  
}

pkg/storage/intent_interleaving_iter.go line 731 at r2 (raw file):

// steps intentIter to the next intent key and decodes it into i.intentKey.
func (i *intentInterleavingIter) stepIntentIterAndDecodeLockKey(

nit: stepIntentIterAndDecodeLockKey steps ...


pkg/storage/intent_interleaving_iter_test.go line 588 at r2 (raw file):

			// Lock.
			str := lock.Shared
			if rng.Int31n(2) == 0 {

If you take the suggestion about generating more than 1 shared locks, we might want to pull this outside the loop.


pkg/storage/intent_interleaving_iter_test.go line 598 at r2 (raw file):

			lockLTKey := LockTableKey{Key: key, Strength: str, TxnUUID: txnUUID}
			lkv = append(lkv, lockKeyValue{
				key: lockLTKey, val: lockVal, liveKey: hasLock && i == 0})

Given multiple shared locks can be compatible with each other, if we're in the str == lock.Shared case, would it be interesting to generate more than 1 shared locks here?

@nvanbenschoten nvanbenschoten force-pushed the nvanbenschoten/intentInterLocks branch from 4323593 to 339bf7a Compare August 29, 2023 15:15
Copy link
Member Author

@nvanbenschoten nvanbenschoten left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewable status: :shipit: complete! 1 of 0 LGTMs obtained (waiting on @arulajmani and @sumeerbhola)


pkg/storage/intent_interleaving_iter.go line 716 at r2 (raw file):

Previously, arulajmani (Arul Ajmani) wrote…

nit: seekIntentIterAndDecodeLockKey seeks ...

Done.


pkg/storage/intent_interleaving_iter.go line 719 at r2 (raw file):

Previously, arulajmani (Arul Ajmani) wrote…

I see we do this elsewhere, so feel free to disregard to keep things uniform, but would this logic be better expressed as:

switch i.dir {  
case 1:  
 iterState, err = i.intentIter.SeekEngineKeyGEWithLimit(seekKey, limitKey)  
case -1:  
 iterState, err = i.intentIter.SeekEngineKeyLTWithLimit(seekKey, limitKey)  
default:  
 return iterState, errors.AssertionFailedf(" ... ")  
}

Yeah, i.dir < 0 and i.dir > 0 seem to be the preferred way to use this field in the file, so I'll follow the same pattern here.


pkg/storage/intent_interleaving_iter.go line 731 at r2 (raw file):

Previously, arulajmani (Arul Ajmani) wrote…

nit: stepIntentIterAndDecodeLockKey steps ...

Done.


pkg/storage/intent_interleaving_iter_test.go line 588 at r2 (raw file):

Previously, arulajmani (Arul Ajmani) wrote…

If you take the suggestion about generating more than 1 shared locks, we might want to pull this outside the loop.

Done.


pkg/storage/intent_interleaving_iter_test.go line 598 at r2 (raw file):

Previously, arulajmani (Arul Ajmani) wrote…

Given multiple shared locks can be compatible with each other, if we're in the str == lock.Shared case, would it be interesting to generate more than 1 shared locks here?

Done.

Copy link
Collaborator

@sumeerbhola sumeerbhola left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed 5 of 5 files at r3, all commit messages.
Reviewable status: :shipit: complete! 0 of 0 LGTMs obtained (and 1 stale) (waiting on @arulajmani and @nvanbenschoten)


pkg/storage/intent_interleaving_iter.go line 586 at r4 (raw file):

			limitKey = i.makeUpperLimitKey()
		}
		if _, err := i.seekIntentIterAndDecodeLockKey(EngineKey{Key: intentSeekKey}, limitKey); err != nil {

Given that the strength is the first byte in the version, I think we can do better and seek to the versions that begin with the intent strength. Similarly for the SeekLT. That should eliminate the need to iterate past non-intent locks in these seek cases.

For intentInterleavingIter.Prev, since byte 3 is going to sort before the others, stepping back will first encounter the other locks of the preceding roachpb.Key. For intentIntentInterleaving.Next, stepping forward will first encounter the other locks of the same roachpb.Key. So for both these cases (where we call NextEngineKeyWithLimit or PrevEngineKeyWithLimit) we do need iteration. The one concern I have with introducing a loop where we didn't have one before (and I haven't thought through this properly), is the few cases of the form

var limitKey roachpb.Key  
if i.iterValid && !i.prefix {  
 limitKey = i.makeUpperLimitKey()  
}  
iterState, err := i.intentIter.NextEngineKeyWithLimit(limitKey)

where we are not in prefix iteration AND we don't produce a limitKey. We won't stop until we hit the iterator bounds if there are no intents but lot of other locks. These cases need some examination, since continuing until the iterator bounds is not good.


pkg/storage/intent_interleaving_iter.go line 778 at r4 (raw file):

		return false, err
	}
	lockTableKey, err := engineKey.ToLockTableKey()

This could be optimized if we often expect to find non-intent locks, since there is no need to do all the work in ToLockTableKey. A TODO is fine.

…marks

All intents are now separated.

Epic: None
Release note: None
Informs cockroachdb#100193.

This commit updates the intentInterleavingIter to ignore locks
in the lock table keyspace with strengths other than lock.Intent
(i.e. shared and exclusive locks). Future versions of the
iterator may expose information to users about whether any
non-intent locks were observed and, if so, which keys they were
found on. For now, no such information is exposed.

This change is needed for replicated locks. Non-locking reads
will not interact with these locks at all, so we want the
intentInterleavingIter to ignore them. Meanwhile, locking reads
and writes will use a different abstraction to peek into the
lock table and look for conflicts.

Release note: None
…Iter

This commit configures the intentInterleavingIter to dynamically adjust
the number of iterations that it will try across the locks on single
user key while searching for intents in the lock table before it does a
SeekGE/SeekLT to skip to the locks on the next/previous user key.

This places a bound on the amount of work that non-locking iteration
will perform for keys with many (shared) locks. As a result, scan speed
will no longer be proportional to the total number of locks on the keys
that it scans over. Scan speed will still be proportional to the number
of keys that have locks, but we expect that keys with locks will also
have values, so this per-locked-key cost is acceptable.

Don't merge, this needs more testing.
@nvanbenschoten nvanbenschoten force-pushed the nvanbenschoten/intentInterLocks branch from 339bf7a to 6cd9334 Compare September 6, 2023 05:37
Copy link
Member Author

@nvanbenschoten nvanbenschoten left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewable status: :shipit: complete! 0 of 0 LGTMs obtained (and 1 stale) (waiting on @arulajmani and @sumeerbhola)


pkg/storage/intent_interleaving_iter.go line 586 at r4 (raw file):

Previously, sumeerbhola wrote…

Given that the strength is the first byte in the version, I think we can do better and seek to the versions that begin with the intent strength. Similarly for the SeekLT. That should eliminate the need to iterate past non-intent locks in these seek cases.

For intentInterleavingIter.Prev, since byte 3 is going to sort before the others, stepping back will first encounter the other locks of the preceding roachpb.Key. For intentIntentInterleaving.Next, stepping forward will first encounter the other locks of the same roachpb.Key. So for both these cases (where we call NextEngineKeyWithLimit or PrevEngineKeyWithLimit) we do need iteration. The one concern I have with introducing a loop where we didn't have one before (and I haven't thought through this properly), is the few cases of the form

var limitKey roachpb.Key  
if i.iterValid && !i.prefix {  
 limitKey = i.makeUpperLimitKey()  
}  
iterState, err := i.intentIter.NextEngineKeyWithLimit(limitKey)

where we are not in prefix iteration AND we don't produce a limitKey. We won't stop until we hit the iterator bounds if there are no intents but lot of other locks. These cases need some examination, since continuing until the iterator bounds is not good.

@sumeerbhola I added a third commit here which configures the intentInterleavingIter to dynamically adjust the number of iterations that it will try across the locks on single user key before it does a SeekGE/SeekLT to skip to the locks on the next/previous user key. The commit also short-circuits without any version iteration for prefix iterators.

I believe this is where we landed after our conversation last week, though I wasn't sure if you still thought the limitKey could be integrated into this logic. Before I add a set of tests for the behavior, do you mind verifying that it's what you expect and that we should proceed with the approach?


pkg/storage/intent_interleaving_iter.go line 778 at r4 (raw file):

Previously, sumeerbhola wrote…

This could be optimized if we often expect to find non-intent locks, since there is no need to do all the work in ToLockTableKey. A TODO is fine.

Done.

Copy link
Collaborator

@sumeerbhola sumeerbhola left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewable status: :shipit: complete! 0 of 0 LGTMs obtained (and 1 stale) (waiting on @arulajmani and @nvanbenschoten)


pkg/storage/intent_interleaving_iter.go line 228 at r7 (raw file):

	// adjustment algorithm that is used by pebbleMVCCScanner when scanning over
	// mvcc versions for a key.
	maxIntentItersBeforeSeek int

I don't see where we are updating this value, for the "dynamic adjustment"


pkg/storage/intent_interleaving_iter.go line 760 at r7 (raw file):

	// Otherwise, iterate over the locks on each key until we find an intent.
	itersBeforeSeek := i.maxIntentItersBeforeSeek / 2
	if itersBeforeSeek == 0 && i.intentIterState != pebble.IterValid {

we need a valid iterator to do a seek, so makes sense that we are stepping when i.intentIterState != pebble.IterValid but why is this a conjunction with itersBeforeSeek == 0?


pkg/storage/intent_interleaving_iter.go line 823 at r7 (raw file):

			}
		} else {
			i.intentKeyBuf = append(i.intentKeyBuf[:0], i.intentKey...)

this will only happen in the first iteration, yes?

@craig craig bot closed this in 9006916 Sep 13, 2023
@nvanbenschoten nvanbenschoten deleted the nvanbenschoten/intentInterLocks branch September 13, 2023 21:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

storage: ignore shared and exclusive locks in intentInterleavingIterator
4 participants