Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
G
go-ipfs
概览
概览
详情
活动
周期分析
版本库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程表
图表
维基
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
jihao
go-ipfs
Commits
ad303335
提交
ad303335
authored
9月 11, 2014
作者:
Brian Tiger Chow
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix(bitswap:ledger) race conditions
https://github.com/jbenet/go-ipfs/issues/39
上级
7bae7428
隐藏空白字符变更
内嵌
并排
正在显示
2 个修改的文件
包含
46 行增加
和
0 行删除
+46
-0
ledger.go
bitswap/ledger.go
+23
-0
ledger_test.go
bitswap/ledger_test.go
+23
-0
没有找到文件。
bitswap/ledger.go
浏览文件 @
ad303335
package
bitswap
import
(
"sync"
"time"
peer
"github.com/jbenet/go-ipfs/peer"
...
...
@@ -9,6 +10,7 @@ import (
// Ledger stores the data exchange relationship between two peers.
type
Ledger
struct
{
lock
sync
.
RWMutex
// Partner is the remote Peer.
Partner
*
peer
.
Peer
...
...
@@ -35,16 +37,25 @@ type Ledger struct {
type
LedgerMap
map
[
u
.
Key
]
*
Ledger
func
(
l
*
Ledger
)
ShouldSend
()
bool
{
l
.
lock
.
Lock
()
defer
l
.
lock
.
Unlock
()
return
l
.
Strategy
(
l
)
}
func
(
l
*
Ledger
)
SentBytes
(
n
int
)
{
l
.
lock
.
Lock
()
defer
l
.
lock
.
Unlock
()
l
.
exchangeCount
++
l
.
lastExchange
=
time
.
Now
()
l
.
Accounting
.
BytesSent
+=
uint64
(
n
)
}
func
(
l
*
Ledger
)
ReceivedBytes
(
n
int
)
{
l
.
lock
.
Lock
()
defer
l
.
lock
.
Unlock
()
l
.
exchangeCount
++
l
.
lastExchange
=
time
.
Now
()
l
.
Accounting
.
BytesRecv
+=
uint64
(
n
)
...
...
@@ -52,10 +63,22 @@ func (l *Ledger) ReceivedBytes(n int) {
// TODO: this needs to be different. We need timeouts.
func
(
l
*
Ledger
)
Wants
(
k
u
.
Key
)
{
l
.
lock
.
Lock
()
defer
l
.
lock
.
Unlock
()
l
.
wantList
[
k
]
=
struct
{}{}
}
func
(
l
*
Ledger
)
WantListContains
(
k
u
.
Key
)
bool
{
l
.
lock
.
RLock
()
defer
l
.
lock
.
RUnlock
()
_
,
ok
:=
l
.
wantList
[
k
]
return
ok
}
func
(
l
*
Ledger
)
ExchangeCount
()
uint64
{
l
.
lock
.
RLock
()
defer
l
.
lock
.
RUnlock
()
return
l
.
exchangeCount
}
bitswap/ledger_test.go
0 → 100644
浏览文件 @
ad303335
package
bitswap
import
(
"sync"
"testing"
)
func
TestRaceConditions
(
t
*
testing
.
T
)
{
const
numberOfExpectedExchanges
=
10000
l
:=
new
(
Ledger
)
var
wg
sync
.
WaitGroup
for
i
:=
0
;
i
<
numberOfExpectedExchanges
;
i
++
{
wg
.
Add
(
1
)
go
func
()
{
defer
wg
.
Done
()
l
.
ReceivedBytes
(
1
)
}()
}
wg
.
Wait
()
if
l
.
ExchangeCount
()
!=
numberOfExpectedExchanges
{
t
.
Fail
()
}
}
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论