国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

舒服了,踩到一個關(guān)于分布式鎖的非比尋常的BUG!

共 8752字,需瀏覽 18分鐘

 ·

2022-05-20 08:46


提到分布式鎖,大家一般都會想到 Redis。

想到 Redis,一部分同學會說到 Redisson。

那么說到 Redisson,就不得不掰扯掰扯一下它的“看門狗”機制了。

所以你以為這篇文章我要給你講“看門狗”嗎?

不是,我主要是想給你匯報一下我最近研究的由于引入“看門狗”之后,給 Redisson 帶來的兩個看起來就心里一緊的 bug :

  • 看門狗不生效的 BUG。
  • 看門狗導致死鎖的 BUG。

為了能讓你絲滑入戲,我還是先簡單的給你鋪墊一下,Redisson 的看門狗到底是個啥東西。

看門狗描述

你去看 Redisson 的 wiki 文檔,在鎖的這一部分,開篇就提到了一個單詞:watchdog

https://github.com/redisson/redisson/wiki/8.-distributed-locks-and-synchronizers

watchdog,就是看門狗的意思。

它是干啥用的呢?

好的,如果你回答不上來這個問題。那當你遇到下面這個面試題的時候肯定懵逼。

面試官:請問你用 Redis 做分布式鎖的時候,如果指定過期時間到了,把鎖給釋放了。但是任務(wù)還未執(zhí)行完成,導致任務(wù)再次被執(zhí)行,這種情況你會怎么處理呢?

這個時候,99% 的面試官想得到的回答都是看門狗,或者一種類似于看門狗的機制。

如果你說:這個問題我遇到過,但是我就是把過期時間設(shè)置的長一點。

時間到底設(shè)置多長,是你一個非常主觀的判斷,設(shè)置的長一點,能一定程度上解決這個問題,但是不能完全解決。

所以,請回去等通知吧。

或者你回答:這個問題我遇到過,我不設(shè)置過期時間,由程序調(diào)用 unlock 來保證。

好的,程序保證調(diào)用 unlock 方法沒毛病,這是在程序?qū)用婵煽?、可保證的。但是如果你程序運行的服務(wù)器剛好還沒來得及執(zhí)行 unlock 就宕機了呢,這個你不能打包票吧?

這個鎖是不是就死鎖了?

所以......

為了解決前面提到的過期時間不好設(shè)置,以及一不小心死鎖的問題,Redisson 內(nèi)部基于時間輪,針對每一個鎖都搞了一個定時任務(wù),這個定時任務(wù),就是看門狗。

在 Redisson 實例被關(guān)閉前,這個狗子可以通過定時任務(wù)不斷的延長鎖的有效期。

因為你根本就不需要設(shè)置過期時間,這樣就從根本上解決了“過期時間不好設(shè)置”的問題。默認情況下,看門狗的檢查鎖的超時時間是 30 秒鐘,也可以通過修改參數(shù)來另行指定。

如果很不幸,節(jié)點宕機了導致沒有執(zhí)行 unlock,那么在默認的配置下最長 30s 的時間后,這個鎖就自動釋放了。

那么問題來了,面試官緊接著來一個追問:怎么自動釋放呢?

這個時候,你只需要來一個戰(zhàn)術(shù)后仰:程序都沒了,你覺得定時任務(wù)還在嗎?定時任務(wù)都不在了,所以也不會存在死鎖的問題。

搞 Demo

前面簡單介紹了原理,我也還是給你搞個簡單的 Demo 跑一把,這樣更加的直觀。

引入依賴,啟動 Redis 什么的就不說了,直接看代碼。

示例代碼非常簡單,就這么一點內(nèi)容,非常常規(guī)的使用方法:

把項目啟動起來,觸發(fā)接口之后,通過工具觀察 Redis 里面 whyLock 這個 key 的情況,是這樣的:

你可以看到在我的截圖里面,是有過期時間的,也就是我打箭頭的地方。

然后我給你搞個動圖,你仔細看過期時間(TTL)這個地方,有一個從 20s 變回 30s 的過程:

首先,我們的代碼里面并沒有設(shè)置過期時間的動作,也沒有去更新過期時間的這個動作。

那么這個東西是怎么回事呢?

很簡單,Redisson 幫我們做了這些事情,開箱即用,當個黑盒就完事了。

接下來我就是帶你把黑盒變成白盒,然后引出前面提到的兩個 bug。

我的測試用例里面用的是 3.16.0 版本的 Redission,我們先找一下它關(guān)于設(shè)置過期動作的源碼。

首先可以看到,我雖然調(diào)用的是無參的 lock 方法,但是它其實也只是一層皮而已,里面還是調(diào)用了帶入?yún)⒌?lock 方法,只不過給了幾個默認值,其中 leaseTime 給的是 -1:

而有參的 lock 的源碼是這樣的,主要把注意力放到我框起來的這一行代碼中:

tryAcquire 方法是它的核心邏輯,那么這個方法是在干啥事兒呢?

點進去看看,這部分源碼又是這樣的:

其中 tryLockInnerAsync 方法就是執(zhí)行 Redis 的 Lua 腳本來加鎖。

既然是加鎖了,過期時間肯定就是在這里設(shè)置的,也就是這里的 leaseTime:

而這里的 leaseTime 是在構(gòu)造方法里面初始化的,在我的 Demo 里面,用的是配置中的默認值,也就是 30s :

所以,為什么我們的代碼里面并沒有設(shè)置過期時間的動作,但是對應的 key 卻有過期時間呢?

這里的源碼回答了這個問題。

額外提一句,這個時間是從配置中獲取的,所以肯定是可以自定義的,不一定非得是 30s。

另外需要注意的是,到這里,我們出現(xiàn)了兩個不同的 leaseTime。

分別是這樣的:

  • tryAcquireOnceAsync 方法的入?yún)?leaseTime,我們的示例中是 -1。
  • tryLockInnerAsync 方法的入?yún)?leaseTime,我們的示例中是默認值 30 * 1000。

在前面加完鎖之后,緊接著就輪到看門狗工作了:

前面我說了,這里的 leaseTime 是 -1,所以觸發(fā)的是 else 分支中的 scheduleExpirationRenewal 代碼。

而這個代碼就是啟動看門狗的代碼。

換句話說,如果這里的 leaseTime 不是 -1,那么就不會啟動看門狗。

那么怎么讓 leaseTime 不是 -1 呢?

自己指定加鎖時間:

說人話就是如果加鎖的時候指定了過期時間,那么 Redission 不會給你開啟看門狗的機制。

這個點是無數(shù)人對看門狗機制不清楚的人都會記錯的一個點,我曾經(jīng)在一個群里面據(jù)理力爭,后來被別人拿著源碼一頓亂捶。

是的,我就是那個以為指定了過期時間之后,看門狗還會繼續(xù)工作的人。

打臉老疼了,希望你不要步后塵。

接著來看一下 scheduleExpirationRenewal 的代碼:

里面就是把當前線程封裝成了一個對象,然后維護到一個 MAP 中。

這個 MAP 很重要,我先把它放到這里,混個眼熟,一會再說它:

你只要記住這個 MAP 的 key 是當前線程,value 是 ExpirationEntry 對象,這個對象維護的是當前線程的加鎖次數(shù)。

然后,我們先看 scheduleExpirationRenewal 方法里面,調(diào)用 MAP 的 putIfAbsent 方法后,返回的 oldEntry 不為空的情況。

這種情況說明是第一次加鎖,會觸發(fā) renewExpiration 方法,這個方法里面就是看門狗的核心邏輯。

而在 scheduleExpirationRenewal 方法里面,不管前面提到的 oldEntry 是否為空,都會觸發(fā) addThreadId 方法:

從源碼中可以看出來,這里僅僅對當前線程的加鎖次數(shù)進行一個維護。

這個維護很好理解,因為要支持鎖的重入嘛,就得記錄到底重入了幾次。

加鎖一次,次數(shù)加一。解鎖一次,次數(shù)減一。

接著看 renewExpiration 方法,這就是看門狗的真面目了:

首先這一坨邏輯主要就是一個基于時間輪的定時任務(wù)。

標號為 ④ 的地方,就是這個定時任務(wù)觸發(fā)的時間條件:internalLockLeaseTime / 3。

前面我說了,internalLockLeaseTime 默認情況下是 30* 1000,所以這里默認就是每 10 秒執(zhí)行一次續(xù)命的任務(wù),這個從我前面給到的動態(tài)里面也可以看出,ttl 的時間先從 30 變成了 20 ,然后一下又從 20 變成了 30。

標號為 ①、② 的地方干的是同一件事,就是檢查當前線程是否還有效。

怎么判斷是否有效呢?

就是看前面提到的 MAP 中是否還有當前線程對應的 ExpirationEntry 對象。

沒有,就說明是被 remove 了。

那么問題就來了,你看源碼的時候非常自然而然的就應該想到這個問題:什么時候調(diào)用這個 MAP 的 remove 方法呢?

很快,在接下來講釋放鎖的地方,你就可以看到對應的 remove。這里先提一下,后面就能呼應上了。

核心邏輯是標號為 ③ 的地方。我?guī)阕屑毧纯?,主要關(guān)注我加了下劃線的地方。

能走到 ③ 這里說明當前線程的業(yè)務(wù)邏輯還未執(zhí)行完成,還需要繼續(xù)持有鎖。

首先看 renewExpirationAsync 方法,從方法命名上我們也可以看出來,這是在重置過期時間:

上面的源碼主要是一個 lua 腳本,而這個腳本的邏輯非常簡單。就是判斷鎖是否還存在,且持有鎖的線程是否是當前線程。如果是當前線程,重置鎖的過期時間,并返回 1,即返回 true。

如果鎖不存在,或者持有鎖的不是當前線程,那么則返回 0,即返回 false。

接著標號為 ③ 的地方,里面首先判斷了執(zhí)行 renewExpirationAsync 方法是否有異常。

那么問題就來了,會有什么異常呢?

這個地方的異常,主要是因為要到 Redis 執(zhí)行命令嘛,所以如果 Redis 出問題了,比如卡住了,或者掉線了,或者連接池沒有連接了等等各種情況,都可能會執(zhí)行不了命令,導致異常。

如果出現(xiàn)異常了,則執(zhí)行下面這行代碼:

EXPIRATION_RENEWAL_MAP.remove(getEntryName());

然后就 return ,這個定時任務(wù)就結(jié)束了。

好,記住這個 remove 的操作,非常重要,先混個眼熟,一會會講。

如果執(zhí)行 renewExpirationAsync 方法的時候沒有異常。這個時候的返回值就是 true 或者 false。

如果是 true,說明續(xù)命成功,則再次調(diào)用 renewExporation 方法,等待著時間輪觸發(fā)下一次。

如果是 false,說明這把鎖已經(jīng)沒有了,或者易主了。那么也就沒有當前線程什么事情了,啥都不用做,默默的結(jié)束就行了。

上鎖和看門狗的一些基本原理就是前面說到這么多。

接著簡單看看 unlock 方法里面是怎么回事兒的。

首先是 unlockInnerAsync 方法,這里面就是 lua 腳本釋放鎖的邏輯:

這個方法返回的是 Boolean,有三種情況。

  • 返回為 null,說明鎖不存在,或者鎖存在,但是 value 不匹配,表示鎖已經(jīng)被其他線程占用。
  • 返回為 true,說明鎖存在,線程也是對的,重入次數(shù)已經(jīng)減為零,鎖可以被釋放。
  • 返回為 false,說明鎖存在,線程也是對的,但是重入次數(shù)還不為零,鎖還不能被釋放。

但是你看 unlockInnerAsync 是怎么處理這個返回值的:

返回值,也就是 opStatus,僅僅是判斷了返回為 null 的情況,拋出異常表明這個鎖不是被當前線程持有的,完事。

它并不關(guān)心返回為 true 或者為 false 的情況。

然后再看我框起來的 ?cancelExpirationRenewal(threadId); 方法:

這里面就有 remove 方法。

而前面鋪墊了這么多其實就是為了引出這個 cancelExpirationRenewal 方法。

縱觀一下加鎖和解鎖,針對 MAP 的操作,看一下下面的這個圖片:

標號為 ① 的地方是加鎖,調(diào)用 MAP 的 put 方法。

標號為 ② 的地方是放鎖,調(diào)用 MAP 的 remove 方法。

記住上面這一段分析,和操作這個 MAP 的時機,下面說的 BUG 都是由于對這個 MAP 的操作不恰當導致的。

看門狗不生效的BUG

前面找了一個版本給大家看源碼,主要是為了讓大家把 Demo 跑起來,畢竟引入 maven 依賴的成本是小很多的。

但是真的要研究源碼,還是得把先把源碼拉下來,慢慢的啃起來。

直接拉項目源碼的好處我在之前的文章里面已經(jīng)說很多次了,對我而言,無外乎就三個目的:

  • 可以保證是最新的源碼
  • 可以看到代碼的提交記錄
  • 可以找到官方的測試用例

好,話不多說,首先我們看看開篇說的第一個 BUG:看門狗不生效的問題。

從這個 issues 說起:

https://github.com/redisson/redisson/issues/2515

在這個 issues 里面,他給到了一段代碼,然后說他預期的結(jié)果是在看門狗續(xù)命期間,如果出現(xiàn)程序和 Redis 的連接問題,導致鎖自動過期了,那么我再次申請同一把鎖,應該是讓看門狗再次工作才對。

但是實際的情況是,即使前一把鎖由于連接異常導致過期了,程序再成功申請到一把新鎖,但是這個新的鎖,30s 后就自動過期了,即看門狗不會工作。

這個 issues 對應的 pr 是這個:

https://github.com/redisson/redisson/pull/2518

在這個 pr 里面,提供了一個測試用例,我們可以直接在源碼里面找到:

org.redisson.RedissonLockExpirationRenewalTest

這就是拉源碼的好處。

在這個測試用例里面,核心邏輯是這樣的:

首先需要說明的是,在這個測試用例里面,把看門狗的 lockWatchdogTimeout 參數(shù)修改為 1000 ms:

也就是說看門狗這個定時任務(wù),每 333ms 就會觸發(fā)一次。

然后我們看標號為 ① 的地方,先申請了一把鎖,然后 Redis 發(fā)生了一次重啟,重啟導致這把鎖失效了,比如還沒來得及持久化,或者持久化了,但是重啟的時間超過了 1s,這鎖就沒了。

所以,在調(diào)用 unlock 方法的時候,肯定會拋出 IllegalMonitorStateException 異常,表示這把鎖沒了。

到這里一切正常,還能理解。

但是看標號為 ② 的地方。

加鎖之后,業(yè)務(wù)邏輯會執(zhí)行 2s,肯定會觸發(fā)看門狗續(xù)命的操作。

在這個 bug 修復之前,在這里調(diào)用 unlock 方法也會拋出 IllegalMonitorStateException 異常,表示這把鎖沒了:

先不說為啥吧,至少這妥妥的是一個 Bug 了。

因為按照正常的邏輯,這個鎖應該一直被續(xù)命,然后直到調(diào)用 unlock 才應該被釋放。

好,bug 的演示你也看到了,也可以復現(xiàn)了。你猜是什么原因?

答案其實我在前面應該給你寫出來了,就看這波前后呼應你能不能反應過來了。

首先前提是兩次加鎖的線程是同一個,然后我前面不是特意強調(diào)了 oldEntry 這個玩意嗎:

上面這個 bug 能出現(xiàn),說明第二次 lock 的時候 oldEntry 在 MAP 里面是存在的,因此誤以為當前看門狗正在工作,直接進入重入鎖的邏輯即可。

為什么第二次 lock 的時候 oldEntry 在 MAP 里面是存在的呢?

因為第一次 unlock 的時候,沒有從 MAP 里面把當前線程的 ExpirationEntry 對象移走。

為什么沒有移走呢?

看一下這個哥們測試的 Redisson 版本:

在這個版本里面,釋放鎖的邏輯是這樣的:

誒,不對呀,這不是有 cancelExpirationRenewal(threadId) 的邏輯嗎?

沒錯,確實有。

但是你看什么情況下會執(zhí)行這個邏輯。

首先是出現(xiàn)異常的情況,但是在我們的測試用例中,兩次調(diào)用 unlock 的時候 Redis 是正常的,不會拋出異常。

然后是 opStatus 不為 null 的時候會執(zhí)行該邏輯。

也就是說 opStatus 為 null 的時候,即當前鎖沒有了,或者易主了的時候,不會觸發(fā) cancelExpirationRenewal(threadId) 的邏輯。

巧了,在我們的場景里面,第一次調(diào)用 unlock 方法的時候,就是因為 Redis 重啟導致鎖沒有了,因此這里返回的 opStatus 為 null,沒有觸發(fā) cancelExpirationRenewal 方法的邏輯。

導致我第二次在當前線程中調(diào)用 lock 的時候,走到下面這里的時候,oldEntry 不為空:

所以,走了重入的邏輯,并沒有啟動看門狗。

由于沒有啟動看門狗,導致這個鎖在 1000ms 之后就自動釋放了,可以被別的線程搶走拿去用。

隨后當前線程業(yè)務(wù)邏輯執(zhí)行完成,第二次調(diào)用 unlock,當然就會拋出異常了。

這就是 BUG 的根因。

找到問題就好了,一行代碼就能解決:

只要調(diào)用了 unlock 方法,不管怎么樣,先調(diào)用 cancelExpirationRenewal(threadId) 方法,準沒錯。

這就是由于沒有及時從 MAP 里面移走當前線程對應的對象,導致的一個 BUG。

再看看另外一個的 issue:

https://github.com/redisson/redisson/issues/3714

這個問題是說如果我的鎖由于某些原因沒了,當我在程序里面再次獲取到它之后,看門狗應該繼續(xù)工作。

聽起來,說的是同一個問題對不對?

是的,就是說的同一個問題。

但是這個問題,提交的代碼是這樣的:

在看門狗這里,如果看門狗續(xù)命失敗,說明鎖不存在了,即 res 返回為 false,那么也主動執(zhí)行一下 cancelExpirationRenewal 方法,方便為后面的加鎖成功的線程讓路,以免耽誤別人開啟看門狗機制。

這樣就能有雙重保障了,在 unlock 和看門狗里面都會觸發(fā) cancelExpirationRenewal 的邏輯,而且這兩個邏輯也并不會沖突。

另外,我提醒一下,最終提交的代碼是這樣的,兩個方法入?yún)⑹遣灰粯拥模?/p>

為什么從 threadId 修改為 null 呢?

留個思考題吧,就是從重入的角度考慮的,可以自己去研究一下,很簡單的。

看門狗導致死鎖的BUG

這個 BUG 解釋起來就很簡單了。

看看這個 issue:

https://github.com/redisson/redisson/issues/1966

在這里把復現(xiàn)的步驟都寫的清清楚楚的。

測試程序是這樣的,通過定時任務(wù) 1s 觸發(fā)一次,但是任務(wù)會執(zhí)行 2s,這樣就會導致鎖的重入:

他這里提到一個命令:

CLIENT PAUSE 5000

主要還是模擬 Redis 處理請求超時的情況,就是讓 Redis 假死 5s,這樣程序發(fā)過來的請求就會超時。

這樣,重入的邏輯就會發(fā)生混亂。

看一下這個 bug 修復的對應的關(guān)鍵代碼之一:

不管 opStatus 返回為 false 還是 true,都執(zhí)行 cancelExpirationRenewal 邏輯。

問題的解決之道,還是在于對 MAP 的操作。

另外,多提一句。

也是在這次提交中,把維護重入的邏輯封裝到了 ExpirationEntry 這個對象里面,比起之前的寫法優(yōu)雅了很多,有興趣的可以把源碼拉下來進行一下對比,感受一下什么叫做優(yōu)雅的重構(gòu):

線程中斷

在寫文章的時候,我還發(fā)現(xiàn)一個有意思的,但對于 Redisson 無解的 bug。

就是這里:

我第一眼看到這一段代碼就很奇怪,這樣奇怪的寫法,背后肯定是有故事的。

這背后對應的故事,藏在這個 issue 里面:

https://github.com/redisson/redisson/issues/2714

翻譯過來,說的是當 tryLock 方法被中斷時,看門狗還是會不斷地更新鎖,這就造成了無限鎖,也就是死鎖。

我們看一下對應的測試用例:

開啟了一個子線程,在子線程里面執(zhí)行了 tryLock 的方法,然后主線程里面調(diào)用了子線程的 interrupt 方法。

你說這個時候子線程應該怎么辦?

按理來說,線程被中斷了,是不是看門狗也不應該工作呢?

是的,所以這樣的代碼就出現(xiàn)了:

但是,你細品,這幾行代碼并沒有完全解決看門狗的問題。只能在一定概率上解決第一次調(diào)用后 renewExpiration 方法后,還沒來得及啟動定時任務(wù)之前的這一小段時間。

所以,測試案例里面的 sleep 時間,只有 5ms:

這時間要是再長一點,就會觸發(fā)看門狗機制。

一旦觸發(fā)看門狗機制,觸發(fā) renewExpiration 方法的線程就會變成定時任務(wù)的線程。

你外面的子線程 interrupt 了,和我定時任務(wù)的線程有什么關(guān)系?

比如,我把這幾行代碼移動到這里:

其實沒有任何卵用:

因為線程變了。

對于這個問題,官方的回答是這樣的:

大概意思就是說:嗯,你說的很有道理,但是 Redisson 的看門狗工作范圍是整個實例,而不是某個指定的線程。

意外收獲

最后,再來一個意外收獲:

你看 addThreadId 這個方法重構(gòu)了一次。

但是這次重構(gòu)就出現(xiàn)問題了。

原來的邏輯是當 counter 是 null 的時候,初始化為 1。不為 null 的時候,就執(zhí)行 counter++,即重入。

重構(gòu)之后的邏輯是當 counter 是 null 的時候,先初始化為 1,然后緊接著執(zhí)行 counter++。

那豈不是 counter 直接就變成了 2,和原來的邏輯不一樣了?

是的,不一樣了。

搞的我 Debug 的時候一臉懵逼,后來才發(fā)現(xiàn)這個地方出現(xiàn)問題了。

那就不好意思了,意外收獲,混個 pr 吧:

荒腔走板

這期沒啥好荒的了,我在《五一躺平的感覺怎么說呢?太特么爽了!》這篇推文里面都已經(jīng)荒過了,沒看過的可以去看看我沒有學習的、五一的快樂生活。

雖然快樂吧,但是我感覺自己還沒休息好呢,五一唰的一下就沒了。

還沒開始上班,我就已經(jīng)隱隱感覺到有點累了。

因為 8 號放假的那天剛好輪到我值班,你可以理解為那天需要我加班,你知道這意味著啥嗎?

這意味著我得連續(xù)上 9 天班。

你說遭不遭得?。?/p>

遭不住,對不對。

所以,即使五一已經(jīng)過去了,我還是想向發(fā)明五一調(diào)休的人才問好:我衷心的謝謝你全家。


瀏覽 25
點贊
評論
收藏
分享

手機掃一掃分享

分享
舉報
評論
圖片
表情
推薦
點贊
評論
收藏
分享

手機掃一掃分享

分享
舉報

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 欧美熟女性爱视频| 91日韩欧美| 日韩免费视频| 欧美在线观看网站18| 天天天天操| 日韩操逼网站| 国产又黄又大又粗| 在线亚洲欧美| 狠狠精品| 亚洲av高清无码| 国产传媒一区| 久久不雅视频| 国产老熟女高潮毛片A片仙踪林| 一级欧美一级日韩| 免费A片国产毛无码A片| 色婷婷综合激情| 国产精品免费观看久久久久久久久| 欧美污视频在线观看| 四川BBB搡BBB爽爽爽欧美| 伊人网视频| 国产精品一二三区| 99免费在线观看| 无码一区二| 亚洲激情片| 日日躁夜夜躁| 91综合视频在线播放| 97欧美日韩| 精品九九九九九九| 小佟丽娅大战91哥| 欧美777| 中文字幕日韩欧美| 98国产精品| 性亚洲| 欧美色国| 九九精品99| 久久国产一区| 中文字幕中文| 日韩香蕉网| 一大高清日韩| 福利大香蕉| 999久久精品| 久色视频福利| 国产av高清| 日韩操逼网| 成人免费视频18| 另类日韩| 亚洲日韩视频在线| 青娱乐伊人| 超碰爱爱| 三上悠亚无码破解69XXX| 无码人妻在线播放| 国产青草| 91久久久久久久18| 九七在线视频| AV国产精品| 曰韩一级A片| 毛片av在线| 五月六月丁香激情视频| 在线综合国产欧美| 天堂在线最新资源| 一区二区三区四区视频| 91青青草| 在线观看国产| 操逼在线观看| 九九无码| 成人视频免费在线观看| 波多野结衣不卡| 无码在线免费观看视频| 中文字幕在线资源| 97久久精品国产熟妇高清网| 欧美日韩国产成人| 夜夜狠狠擅视频| 91狠狠| 亚洲无码一级| 大香蕉官网| 国产欧美综合视频| AA黄色片| 天天综合国产| 大香蕉性爱视频| 亚洲在线无码视频| 人妻少妇无码| 色婷婷视频在线| 成人国产在线观看| 欧美群交在线| 婷婷日韩一区二区三区| 精品中文字幕在线观看| 亚洲性网| 久久久久久久久久久高清毛片一级| 国产无遮挡又黄又爽免费网站 | 中文字字幕在线中文乱码更新时间| 玖玖成人| 一区二区高清无码| 黄色视频| 国精产品一区一区三区四区| 亚洲AV秘一区二区色盗战流出 | 免费黄色网址啊不卡| 欧美色成人免费在线视频| 久久大香蕉| 玩弄大乳乳妾高潮乳喷视频| 日韩免费在线视频观看| 9191久久| 三级视频网址| 婷婷久久久久久| 国产对白视频| www.re99| 免费成人高清视频| 一级a免一级a做免费线看内祥| 欧美精品在线观看视频| 三级免费| 丁香色色网| 五月婷婷一区| 五月天丁香社区| 91你懂的| 亚洲第一中文字幕网| 毛片自拍| 欧美性爱动态| 看免费操逼视频| 中文亚洲视频| 自拍偷拍图区| 啪啪网站免费观看| 国产伊人在线| 日逼网站免费观看| 精品人妻一区二区三区-国产精品 无码人妻av黄色一区二区三区 | 婷婷看片| 在线久草| 日韩操逼网站| 九九九久久久| 国产不卡在线| 日韩AV在线免费观看| 国产福利视频| 国产免费一区二区三区四区 | 先锋成人av| 好吊顶亚洲AV大香蕉色色| 69福利网| 牛牛精品视频| 26∪u∪成人网站| 久久伊人影院| 久久三级| 免费看毛片中文字幕| 国产免看一级a一片成人aⅴ| 中文字幕北条麻妃| 日韩精品一区二区亚洲AV观看| 一级黄色电影免费| 黄色片一区二区| 激情久久婷婷| 成人网站在线免费看| 成人精品18| 国产精品怡红院有限公司| 中国黄色一级A片| 三级成人AV| 亚洲一级a| 2026国产精品视频| 国产乱子伦视频国产印度| 大香蕉一级片| 99这里只有精品| 久久人妻无码| 欧美日韩中文视频| 探花极品无套大学生| 欧美久久久久久| 九九色九九| 婷婷五月av| 日韩看片| 操逼电影免费| 黄色三级片视频| 无码aⅴ| 中文有码在线观看| 17c精品麻豆一区二区免费| 亚洲中文字幕一区| 黄色片免费视频网站| 久热中文在线观看精品视频| 狠狠操婷婷| 亚洲黄在线观看| 开心深爱激情网| 成人黄片18| 操骚逼视频| 国产AV网| chinese高潮老女人| 亚洲高清无码网站| 97精品人人妻人人| 久久黄网| 欧美日韩性爰视频| 成人性爱视频免费在线观看| 99草在线视频| 午夜精东影业传媒在线观看| 国产女人在线观看| 国产探花视频在线免费观看| 日日夜夜天天综合| 91香蕉国产视频| 一级黄色网| 黄色成人在线视频| 国产狂喷水潮免费网站www| 国产精品AV一区| AV大片在线观看| 亚洲AV无一区二区三区久久| 国产AV中文字幕| 俺去也| 黄色成年人视频在线观看| 国产深喉视频| 欧美黄片免费在线观看| 日韩一级黄| 神马Aⅴ| 在线观看免费黄视频| 九一亚洲精品| 美女91视频网站| 国产精品一区在线观看| 18+免费网站| 神马午夜三级| 在线无码中文| www.高清无码| 黄色大片免费观看| a√天堂中文8| 国产,亚洲91| 久热思思| 国产棈品久久久久久久久久九秃 | 欧美色图888| 在线视频免费观看| 亚洲无码免费看| 亚洲影音先锋资源| 51妺嘿嘿在线电影免费观看| 看a网站| 综合网伊人| 成人午夜视频精品一区| 色呦呦视频在线观看| 中文字幕无码亚| 偷拍三区| 99热在线中文字幕| 人人操国产| 天天干一干| 超碰AA| 欧美三级视频在线| 亚洲乱伦图片| 婷婷日韩一区二区三区| 日韩在线视频不卡| 亚洲天堂国产| 欧美日韩中文字幕| 国产欧美一区在线看| 成年片免费观看网站免费观看,亚洲+欧... | 91精品亚洲| 在线观看国产欧美| 日韩性爱av| 亲子伦一区二区三区| 免费一级黄色片| 中文字幕av网站| 日本中文字幕网站| 99在线视频免费观看| 国产Av大全| 亚洲AV成人电影| 青青草视频| 日韩人妻无码精品| 三级片AV在线| 丁香色五月婷婷| 久久婷婷视频| 欧美精品网| 欧美一区二区三区不卡| 大鸡巴导航| 四库影库| 人妻丝袜无码视频专区| 激情六月婷婷| 成人性生交片无码免费看人| 成人大片在线观看| 久久黄色视频网站| 日韩性生活| 高清成人无码| 99视频免费| 91插插网| 欧美亚洲日韩一区二区三区| 日无码| 一区二区三区四区成人| av手机版| 详情:绿帽夫妻多人运动开淫啪-91n| 天堂网2018| 色综合一区二区| 就去se超碰| 黑人一区二区三区四区| a片在线视频| 亚洲无码AV麻豆| 超碰人| 91成人视频在线播放| 欧美精品18videosex性欧美| 激情综合网站| 蜜臀色欲AV无码人妻| 神马午夜激情| 国产玖玖| 高清欧美日韩第一摸| 亚洲AⅤ无码一区二区波多野按摩| 精品午夜福利| 亚洲人成免费网站| 大香蕉网在线| 天堂一区二区三区| 欧美日韩黄色极品| 无码理论片| 亚洲va在线∨a天堂va欧美va | 国产免费AV片在线无码免费看| 中文字幕精品视频在线| 日韩高清毛片| 中文在线最新版天堂8| 51妺嘿嘿午夜福利在线| 五月天操逼网| 欧美MV日韩MV国产网站| 北条麻妃网站| 国产又黄又大又粗| 亚洲av偷拍| 尤物在线播放| 人人看,人人摸| 人人操AV| 污污污污污www在线观看优势| 日韩无码操逼视频| 日韩精品一区二区三区四区蜜桃视频 | 精品777| 丰满欧美熟妇免费视频| 天天澡日日久| 国产精品二区高清在线苍井空| 日本A片一级| 夜夜夜叫天天天做| 久久精品一区二区三区四区五区| 国产A级毛片久久久久久| 久草视频福利| 911国产在线| AV中文字幕在线播放| 天天扣天天操| 久久精品苍井空免费一区二| 日批视频| 中文无码在线观看中文字幕av中文 | 日韩精品123| 色就操| 久久久久99精品成人网站| 中文无码日本高潮喷水| 蜜臀av在线观看| 免费一级无码婬片A片AAA毛片| 久久夜色精品国产噜噜亚洲AV| 神马午夜精品96| 国产探花一区二区三区| 国产AV一区二区三区精品| www.777熟女人妻| 中文有码在线| 麻豆三级精品| 亚洲综合影院| 午夜亚洲AV永久无码精品蜜芽| 亚洲无码精品一区| 在线你懂的| 熟女人妻一区二区| 丁香六月| 青青草成人AV| 婷婷色av| 国产91久久婷婷一区二区| 无码免费婬AV片在线观看| 欧美日韩在线观看一区二区三区| 99热免费观看| 无码主播| 国产熟妇婬乱A片免费看牛牛 | 亚洲国产精品一区二区三区| 亚洲成人一级片| 亚洲欧美熟妇久久久久久久久| 影音av资源| 色色色色色欧美| 亚洲福利视频网站| 天天天日天天天操| 人人操人人摸人人看| 成人av网站在线播放| 色婷婷激情视频| 老司机精品在线观看| 精品久久电影| 国产乱码精品一区二区三区的特点| 国产精品无码专区AV免费播放| 日日操天天操夜夜操| 欧美偷拍精品| 影音先锋无码一区| 人成视频在线| 444444在线观看免费高清电视剧木瓜一| 丁香五月社区| 911国产视频| 国产欧美日本| 久久久久黄| 爱搞搞就搞搞| 美女A级毛片| 91在线精品秘一区二区黄瓜| 欧美日韩无码视频| 强伦人妻一区二区三区| 加勒比日韩| 成人免费区一区二区三区| 九色PORN视频成人蝌蚪自拍| 青青草视频免费看| 欧美黄色三级片| 九九惹伊人| 日韩中文字幕一区| 神马午夜三级| 超碰97免费| 日韩不卡AV| 丁香五月激情中文字幕| 99这里有精品| 亚洲日韩精品欧美一区二区yw| 四虎884| 国产综合久久久777777色胡同 | 免费无码又爽又黄又刺激网站| 91在线无码精品国产三年| 亚洲激情黄色| 精品多人P群无码视频| 人人操人人干人人摸| 2024男人天堂| 国产激情综合| 久久天堂AV综合合色蜜桃网| 中出欧美亚洲| 怮交小拗女小嫩苞视频| 成人三级视频在线| 黄片网站视频| 蜜桃传媒一区二区亚洲A| 亚洲免费在线视频| 精品黄色片| 亚洲一区色| 天天操综合| 久久久久久免费| 麻豆三级电影| 水蜜桃视频在线| 黄色自拍视频| 亚洲欧美成人网| 超碰在线人妻| 巨乳国产一区| 成人AV影院| 91精品久久久久久综合五月天| aaa黄片| 99re6热在线精品视频| 91麻豆免费看| 激情视频国产| 日韩中文字幕专区| 在线观看高清无码| 日韩成人性爱| 青娱乐A片| 国产伦精品一区二区三区妓女| 99久热在线精品视频| 败火老熟女ThePorn视频| 青娱乐毛片| 黄色香蕉视频| 欧美国产日韩综合在线观看170| 91色综合| 欧美中文网| 日韩AV免费在线观看| 在线久草| 东北女人毛多又黑A片| 亚洲天堂网在线观看| 俄罗斯白嫩BBwBBwBBw91| 日日干天天日| 精品无码秘人妻一区二区三区| 五月丁香视频在线观看| 人妻无码HEYZO少妇精品| 免费网站观看www在线观看| 第一福利导航大全| 成人性生活一级片| 久草免费电影| www黄色在线观看| 婷婷五月天青草| 亚洲欧美v| 美女网站视频黄| 爆操约了良家| av大全在线观看| 亚洲伦乱| 高清无码免费在线视频| 狠狠躁日日躁夜夜躁A片无码| 天天躁夜夜躁av| 香蕉成人视频| 久久久噜噜噜久久中文字幕色伊伊| 欧美激情区| 夜夜骑免费视频| 成人无码中文字幕| 亚洲av自拍| 嗯啊在线视频| 波多野结衣高清无码| 九九亚洲| 久久视频在线| 影音先锋无码AV| 国产av黄色| 少妇厨房愉情理伦BD在线观看| 亚洲天堂视频网| 強姦婬片A片AAA毛片Mⅴ| 久久99国产乱子伦...| 久久综合伊人7777777| 色婷婷精品国产一区二区三区 | 中文字幕有码在线播放| 白浆av| 婷婷综合久久| 超碰色| 亚洲高清在线| 免费视频91蜜桃| 四川BBB嫩BBBB爽BBBB| 青草香蕉视频| 国产无码自拍| 精品视频免费观看| 丰滿人妻-区二区三区| 欧美操B在线| 国产午夜成人福利在线| 欧美日韩毛片| AV无码网| 成人二区三区| 中文毛片| 免费手机av| 日韩日韩日韩日韩日韩| 日韩无码专区电影| 色啪视频| 国产免费高清| 国产一区二区不卡亚洲涩情| 六月丁香五月| 久久综合99| 成人福利午夜A片公司| 亚洲AV无码成人H动漫| 国产非洲欧美在线| 婷婷久久综合久色综| 日韩欧美操| 日韩成人不卡| 日本国产高清| 国产激情视频在线观看| AV片在线免费观看| 奇米无码| 日本一级片中文字幕| 少妇一区二区三区| 九九精品国产| 日韩夜夜操| 精品久久久无码| 2015中文字幕黄色视频| 青春草在线| 国产尤物视频| 婷婷精品免费| 国产免费黄色视频网站| 五月天黄色电影| 丁香成人五月天| 91无码秘蜜桃一区二区三区-百度| 国产黄色在线看| 91国产视频在线播放| 日韩人妻一区二区| 制服丝袜大香蕉| 无码人妻熟妇| 亚洲成人视频网| 亚洲永久在线| 亚洲天堂在线视频观看| 国产成人无码在线| 国产高清免费无码| 欧美老妇另类BBwBBw| 欧美特级毛片| 91精品人妻一区二区三区蜜桃| 久久久久伊人| 97超级碰| 国精产品一二三区| 亚洲精品国产成人| 国产视频久久| 影音先锋亚洲资源| 亚洲va中文字幕| 老熟女伦一区二区三区| 亚洲日韩在线a成| 撸一撸成人在线做爱视频。| 人人妻人人澡人人爽人人欧美一区 | 人人妻人人澡人人爽人人欧美一区 | 久久精品一区二区| 黄片高清无码| 99re伊人| 91亚洲精品视频在线| 亚洲成人视频网| 国产麻豆精品ThePorn| 97国产| 熟女人妻人妻HD| 亚洲成人大香蕉| 97精品一区二区三区A片| 免费av中文字幕| 国产一级影院| 操B网站| 精品久久久久久久久久| 亚洲v欧美| 狠狠干b| 国产字幕| 亚洲Av无码午夜国产精品色软件| 狠狠AV| 亚洲欧美成人| 制服丝袜人妻| 免费成人黄色网址| 国产AV久久| 在线观看亚洲一区| 先锋影音成人资源| 激情青青草| 国产高清毛片| 亚洲成人在线播放| 深爱婷婷| www.超碰在线| 午夜福利久久| 99久久久精品| 少妇无码在线| 特级西西WWW无码| 国产欧美在线免费观看| 亚洲精品国产精品乱码视99| 亚洲群交| 中文字幕有码视频| A片在线视频| AV免费在线播放| 天堂资源中文在线| 亚洲AV秘成人久久无码海归| 操逼网站在线看| 超碰人人干人人操| 久久久少妇| 婷婷五月天青草| 亚洲AV影院| 九色91视频| 另类罕见稀奇videos| 日本熟妇一区二区三区| 麻豆三级片在线观看| 迷情校园综合| 亚洲a电影| 国产污视频在线观看| 污污污污污www在线观看优势| 午夜精品久久久久久久久无码99热| 国产成人精品八戒| 免费黄色av| 一级片日韩| 高清无码视频在线播放| 日本黄在线观看| 欧美久久精品| 国产成人视频免费| 丁香五月婷婷久久| 欧美日韩小电影| 九色PORNY国产成人| 影音先锋91久久网| 1024大香蕉| 亚洲在线无码播放| 免费福利在线视频| 在线操B视频| 9991区二区三区四区| 国产精品HongKong麻豆| 正在播放李彩斐被洋老外| 无码人妻AⅤ一区二区三区A片一| 亚洲AV无码国产精品| 嫩BBB槡BBBB槡BBB3i| 国产一级二级三级| 国产成人99久久亚洲综合精品 | 国产AV一区二区三区四区| 一级黄色电影免费看| 麻豆成人无码精品视频| av片在线免费观看| 欧美一级网站| 日本一级片在线观看| 亚洲AV无码乱码精| 中文日韩在线| 日韩中文字码无砖| 人人色视频| 国产a毛片| 最新中文字幕免费MV第一季歌词| 亚洲精品一级二级三级| 亚洲va中文字幕| 国产一级A片免费视频| 99热播| 亚洲AV秘无码苍井空| av网站免费观看| 国产一级A片久久久免费看快餐| 少妇白洁在线观看| 99国产精品免费视频观看8| 久操无码| 欧美色999| 一级a一级a爱片免费视频| 91成人免费电影| 伊人五月天激情| 超碰99在线观看| 污污污www精品国产网站| 天干天干天夜夜爽| 人人爽人人爽人人爽| 操毛| 爱干视频| 色婷婷视频在线观看| 国内毛片毛片毛片毛片毛片毛片毛片毛片毛片毛片毛片毛片 | 人人操人人爱人人摸| 激情a| 伊人网导航| 中文字幕丰满的翔田千里| 无码专区在线播放| 国产精品久久久久无码AV| 91久久精品日日躁夜夜躁欧美| 日韩久久高清| 91AV免费在线观看| 亲子伦视频一区二区三区| 九九热av| 无码囯无精品毛片大码| HEZ-502搭讪绝品人妻系列 | 国产最新在线视频| 成人午夜A片免费看| 亚洲色成人网站www永久四虎| 久久yy| 91久久久久久久久久| 一区二区三区无码专区| 成人黄A片免费| 久久免费视频,久久免费视频| 国产午夜成人免费看片无遮挡| 天天操电影| 中文字幕在线视频免费观看| 亚洲无码一本道| 欧美一级婬片A片免费软件| 91偷拍网| 操逼黄色视频| 三洞齐开Av在线免费观看| 五月无码视频| 精品人妻一区二区三区日产乱码 | 欧美精品网| 超碰九一| 中文字幕免费MV第一季歌词| 丁香婷婷激情| 欧美高清视频| 成人国产精品视频| 人人干人人摸人人操| 波多野42部无码喷潮更新时间 | 亚洲日韩精品欧美一区二区yw| 97免费在线观看视频| 日本视频免费| 国产高清久久| 老女人日逼视频| 天天爽天天射| 久久爆乳一区二区三区| 成人伊人网| 欧美一级操| 国产一级在线免费观看| 俺来也俺去www色情网| 夜色88V精品国产亚洲| 久色91| 中文字幕第69页| 高清无码在线免费| 免费无码在线观看| 免费av网站| 天天想天天干| 宅男噜| 大香蕉青娱乐| www.五月丁香| 黄片大全免费看| 午夜一区| 午夜一区二区三区| 精品中文字幕在线播放| 五月天黄色电影网站| 日本黄A三级三级三级| 日日日日日干| 丁香五月六月| 17c精品麻豆一区二区免费| 欧美日韩成人在线| 日韩无码人妻久久一区二区三区| 无码日韩成人| 成人H动漫精品一区二区无码| 另类Av| jizz麻豆| 另类罕见稀奇videos| 日本在线免费| 毛片自拍| 操逼视频试看| 777色色色| 成人视频一区| 日本黄色中文字幕| www.黄| 国产成人一级| 老司机午夜免费精品视频| 热久久在线观看| 最近中文字幕免费mv第一季歌词大全| 美日韩中文字幕| 国产av影院| 六月丁香五月| 婷婷色色五月| 黄色在线视频观看| 一级国产欧美成人A片| 日韩成人在线播放| 久艹| 国产青草视频在线观看| 人妻精品综合码| 99视频| 粉粉嫩嫩的18虎白女| 天天日夜夜爽| 日皮视频网站| 日本熟妇无码一区二区| 亚州天堂网| 99久视频| 操逼视频免费观看| AA片免费| 色五月激情小说| 69国产精品成人无码视频色 | AV草逼| 欧美一级A片在免费看| 国产性爱自拍视频| 国产乱子伦视频国产印度| 日韩精品免费| 中文字幕视频在线直播| 亚洲成人高清在线| 91三级在线观看| 日韩福利电影| 欧美日韩免费| 国产91麻豆视频| 国产精品精品精品| 99久久99久久| 青青草原网| 特级毛片AAAAAA蜜桃| 亚洲欧洲日本在线| 亚洲中文字幕不卡| 91在线播放视频| 欧洲尤物不卡播放六区| 欧美一级成人片| 亚洲无码内射| 欧美不卡一区二区三区| 日韩毛片视频| 精品中文一区二区三区| 91无码人妻精品1国产四虎| 一级黄色网| 亚洲综合日韩在线| 久久久无码精品亚洲日韩男男 | 高H视频在线观看| 在线人妻| 簧片网站免费| 水果派解说av| 蜜桃AV在线| 国产亚洲视频完整在线观看 | 亚洲无码你懂的| 五月天精品视频| 一级av片| 无码视频在线播放| 国产黄色电影在线| 亚洲码无人客一区二区三区| AV在线精品| 特级丰满少妇免费观看| 亚洲欧美日韩成人| 欧美成人免费A级在线观看| 高清免费无码视频| 黄色免费a级片一级片| 久精久久| 青娱乐AV在线| 日韩欧美一级片| 中国老少配BBwBBwBBW| 人人看人人搂人人摸| 九九国产精品| 偷偷操av| 色香蕉网| 婷婷九九| 国产av资源| 一道本无码视频| 亚洲av图片| 激情六月天| 99色亚洲| 国产精品国产三级国产专区53| av一级片| 国产三级国产三级国产普通话| 四虎91| 翔田千里一区二区三区| 免费无码视频| 97超碰人人摸| 免费一级A毛片夜夜看| 日韩在线免费观看视频| igao在线观看| 一区二区三区四区五区无码 | 91成人毛片| 中文字幕av免费在线观看| 亚洲xxxxx| 大香蕉伊人在线手机网| 日爽夜爽| 日韩无码黄片| 蜜臀伊人| 91无码影院| 香蕉三级片| 神马Aⅴ| 亚洲无码中| 国产成人亚洲综合A∨婷婷| 亚洲天堂本一| 波多野结衣操逼| 一道本无码在线| 免费中文资源在线观看| 中文字幕无码影院| 欧美熟妇性爱| 欧美日韩视频一区二区三区| 日韩性爱一区| 一级av片| 国产成人无码区免费视频| 日韩成人av在线| 91超碰在线免费观看| 久草A片| 熟女在线视频| 大鸡吧在线观看| 97精品人妻一区| 特级西西444www大精品| 日韩AV免费在线观看| 日韩字幕无码| 中文字幕Av在线| 欧美日韩视频| 国产乱╳╳AⅤ毛片| 狠狠干大香蕉| 老司机无码| 成人aV无码精品国产一区二区 | 久久婷婷成人综合色怡春院| 国产久久在线| 欧美大胆a| 亚洲精品无码a片| 水蜜桃在线视频| 日逼| 最新在线中文字幕| 欧美黄片免费视频| 中文字幕在线视频第一页| 操逼99| 中国老女人日逼| 亚洲免费观看高清完整版在va线 | 亚洲免费小电影| 午夜激情视频网站| 人人爱人人插高清| 六月激情网| www.婷婷| 人妻爽爽| av中文字幕网| 青草青青视频| 五月天AV在线| 丁香六月婷婷久久综合|