[ 
https://issues.apache.org/jira/browse/HBASE-26465?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

chenglei updated HBASE-26465:
-----------------------------
    Description: 
HBASE-26144 moved {{MemStore.clearSnapshot}} out of write lock of 
{{HStore#lock}}, but because {{MemStore.clearSnapshot}}  closed 
{{DefaultMemStore#snapshot}} which may be used by 
{{DefaultMemStore#getScanners}}, when {{DefaultMemStore#getScanners}} and 
{{MemStore}} flushing execute conurrently, {{MemStoreLAB}} used by 
{{DefaultMemStore#snapshot}}  may be released early when its {{SegmentScanner 
}} is scanning.

Considering follow thread sequences: 
1.The flush thread starts {{DefaultMemStore}} flushing after some cells have be 
added to {{DefaultMemStore}}.

2.The flush thread stopping before {{DefaultMemStore#clearSnapshot}} in
   {{HStore#updateStorefiles}} after completed flushing memStore to hfile.

3.The scan thread starts and stopping after 
{{DefaultMemStore#getSnapshotSegments}} in
   {{DefaultMemStore#getScanners}},here the scan thread gets the 
{{DefaultMemStore#snapshot}} which is created by the flush thread.

4.The flush thread continues {{DefaultMemStore#clearSnapshot}} and close 
{{DefaultMemStore#snapshot}},because the reference count of the corresponding
   {{MemStoreLABImpl}} is 0, the Chunks in corresponding {{MemStoreLABImpl}} 
are recycled.

5.The scan thread continues {{DefaultMemStore#getScanners}}, and create a 
{{SegmentScanner}} for this {{DefaultMemStore#snapshot}}, and increase the
   reference count of the corresponding {{MemStoreLABImpl}}, but {{Chunk}}s in 
corresponding {{MemStoreLABImpl}} are recycled by step 4, and these {{Chunk}}s 
may
   be overwritten by other write threads, which may cause serious problem.

  was:
HBASE-26144 moved {{MemStore.clearSnapshot}} out of write lock of 
{{HStore#lock}}, but because {{MemStore.clearSnapshot}}  closed 
{{DefaultMemStore#snapshot}} which may be used by 
{{DefaultMemStore#getScanners}}, when {{DefaultMemStore#getScanners}} and 
{{MemStore}} flushing execute conurrently, {{MemStoreLAB}} used by 
{{DefaultMemStore#snapshot}}  may be released early when its {{SegmentScanner 
}} is scanning.
Considering follow thread sequences: 
1.The flush thread starts {{DefaultMemStore}} flushing after some cells have be 
added to {{DefaultMemStore}}.
2.The flush thread stopping before {{DefaultMemStore#clearSnapshot}} in
   {{HStore#updateStorefiles}} after completed flushing memStore to hfile.
3.The scan thread starts and stopping after 
{{DefaultMemStore#getSnapshotSegments}} in
   {{DefaultMemStore#getScanners}},here the scan thread gets the 
{{DefaultMemStore#snapshot}} which is created by the flush thread.
4.The flush thread continues {{DefaultMemStore#clearSnapshot}} and close 
{{DefaultMemStore#snapshot}},because the reference count of the corresponding
   {{MemStoreLABImpl}} is 0, the Chunks in corresponding {{MemStoreLABImpl}} 
are recycled.
5.The scan thread continues {{DefaultMemStore#getScanners}}, and create a 
{{SegmentScanner}} for this {{DefaultMemStore#snapshot}}, and increase the
   reference count of the corresponding {{MemStoreLABImpl}}, but {{Chunk}}s in 
corresponding {{MemStoreLABImpl}} are recycled by step 4, and these {{Chunk}}s 
may
   be overwritten by other write threads, which may cause serious problem.


> MemStoreLAB may be released early when its SegmentScanner is scanning
> ---------------------------------------------------------------------
>
>                 Key: HBASE-26465
>                 URL: https://issues.apache.org/jira/browse/HBASE-26465
>             Project: HBase
>          Issue Type: Bug
>    Affects Versions: 3.0.0-alpha-1, 2.4.8
>            Reporter: chenglei
>            Priority: Critical
>
> HBASE-26144 moved {{MemStore.clearSnapshot}} out of write lock of 
> {{HStore#lock}}, but because {{MemStore.clearSnapshot}}  closed 
> {{DefaultMemStore#snapshot}} which may be used by 
> {{DefaultMemStore#getScanners}}, when {{DefaultMemStore#getScanners}} and 
> {{MemStore}} flushing execute conurrently, {{MemStoreLAB}} used by 
> {{DefaultMemStore#snapshot}}  may be released early when its {{SegmentScanner 
> }} is scanning.
> Considering follow thread sequences: 
> 1.The flush thread starts {{DefaultMemStore}} flushing after some cells have 
> be added to {{DefaultMemStore}}.
> 2.The flush thread stopping before {{DefaultMemStore#clearSnapshot}} in
>    {{HStore#updateStorefiles}} after completed flushing memStore to hfile.
> 3.The scan thread starts and stopping after 
> {{DefaultMemStore#getSnapshotSegments}} in
>    {{DefaultMemStore#getScanners}},here the scan thread gets the 
> {{DefaultMemStore#snapshot}} which is created by the flush thread.
> 4.The flush thread continues {{DefaultMemStore#clearSnapshot}} and close 
> {{DefaultMemStore#snapshot}},because the reference count of the corresponding
>    {{MemStoreLABImpl}} is 0, the Chunks in corresponding {{MemStoreLABImpl}} 
> are recycled.
> 5.The scan thread continues {{DefaultMemStore#getScanners}}, and create a 
> {{SegmentScanner}} for this {{DefaultMemStore#snapshot}}, and increase the
>    reference count of the corresponding {{MemStoreLABImpl}}, but {{Chunk}}s 
> in corresponding {{MemStoreLABImpl}} are recycled by step 4, and these 
> {{Chunk}}s may
>    be overwritten by other write threads, which may cause serious problem.



--
This message was sent by Atlassian Jira
(v8.20.1#820001)

Reply via email to