Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
G
go-ipfs
概览
概览
详情
活动
周期分析
版本库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程表
图表
维基
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
jihao
go-ipfs
Commits
89afdabb
提交
89afdabb
authored
1月 13, 2015
作者:
Brian Tiger Chow
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
refactor(fsrepo): move OpenerCounter
上级
97b865ff
隐藏空白字符变更
内嵌
并排
正在显示
2 个修改的文件
包含
26 行增加
和
25 行删除
+26
-25
fsrepo.go
repo/fsrepo/fsrepo.go
+18
-17
counter.go
repo/fsrepo/opener/counter.go
+8
-8
没有找到文件。
repo/fsrepo/fsrepo.go
浏览文件 @
89afdabb
...
...
@@ -10,23 +10,24 @@ import (
repo
"github.com/jbenet/go-ipfs/repo"
common
"github.com/jbenet/go-ipfs/repo/common"
config
"github.com/jbenet/go-ipfs/repo/config"
opener
"github.com/jbenet/go-ipfs/repo/fsrepo/opener"
util
"github.com/jbenet/go-ipfs/util"
debugerror
"github.com/jbenet/go-ipfs/util/debugerror"
)
var
(
//
pkgLock
prevents the fsrepo from being removed while there exist open
//
openerCounter
prevents the fsrepo from being removed while there exist open
// FSRepo handles. It also ensures that the Init is atomic.
//
// packageLock also protects numOpenedRepos
//
// If an operation is used when repo is Open and the operation does not
// change the repo's state, the package lock does not need to be acquired.
pkgLock
*
packageLock
openerCounter
*
opener
.
Counter
)
func
init
()
{
pkgLock
=
makePackageLock
()
openerCounter
=
opener
.
NewCounter
()
}
// FSRepo represents an IPFS FileSystem Repo. It is not thread-safe.
...
...
@@ -47,8 +48,8 @@ func At(path string) *FSRepo {
// Init initializes a new FSRepo at the given path with the provided config.
func
Init
(
path
string
,
conf
*
config
.
Config
)
error
{
pkgLock
.
Lock
()
// lock must be held to ensure atomicity (prevent Removal)
defer
pkgLock
.
Unlock
()
openerCounter
.
Lock
()
// lock must be held to ensure atomicity (prevent Removal)
defer
openerCounter
.
Unlock
()
if
isInitializedUnsynced
(
path
)
{
return
nil
...
...
@@ -65,9 +66,9 @@ func Init(path string, conf *config.Config) error {
// Remove recursively removes the FSRepo at |path|.
func
Remove
(
path
string
)
error
{
pkgLock
.
Lock
()
defer
pkgLock
.
Unlock
()
if
pkgLock
.
NumOpeners
(
path
)
!=
0
{
openerCounter
.
Lock
()
defer
openerCounter
.
Unlock
()
if
openerCounter
.
NumOpeners
(
path
)
!=
0
{
return
errors
.
New
(
"repo in use"
)
}
return
os
.
RemoveAll
(
path
)
...
...
@@ -75,8 +76,8 @@ func Remove(path string) error {
// Open returns an error if the repo is not initialized.
func
(
r
*
FSRepo
)
Open
()
error
{
pkgLock
.
Lock
()
defer
pkgLock
.
Unlock
()
openerCounter
.
Lock
()
defer
openerCounter
.
Unlock
()
if
r
.
state
!=
unopened
{
return
debugerror
.
Errorf
(
"repo is %s"
,
r
.
state
)
}
...
...
@@ -118,7 +119,7 @@ func (r *FSRepo) Open() error {
}
r
.
state
=
opened
pkgLock
.
AddOpener
(
r
.
path
)
openerCounter
.
AddOpener
(
r
.
path
)
return
nil
}
...
...
@@ -211,12 +212,12 @@ func (r *FSRepo) SetConfigKey(key string, value interface{}) error {
// Close closes the FSRepo, releasing held resources.
func
(
r
*
FSRepo
)
Close
()
error
{
pkgLock
.
Lock
()
defer
pkgLock
.
Unlock
()
openerCounter
.
Lock
()
defer
openerCounter
.
Unlock
()
if
r
.
state
!=
opened
{
return
debugerror
.
Errorf
(
"repo is %s"
,
r
.
state
)
}
pkgLock
.
RemoveOpener
(
r
.
path
)
openerCounter
.
RemoveOpener
(
r
.
path
)
return
nil
// TODO release repo lock
}
...
...
@@ -225,13 +226,13 @@ var _ repo.Interface = &FSRepo{}
// IsInitialized returns true if the repo is initialized at provided |path|.
func
IsInitialized
(
path
string
)
bool
{
pkgLock
.
Lock
()
defer
pkgLock
.
Unlock
()
openerCounter
.
Lock
()
defer
openerCounter
.
Unlock
()
return
isInitializedUnsynced
(
path
)
}
// isInitializedUnsynced reports whether the repo is initialized. Caller must
// hold
pkgL
ock.
// hold
openerCounter l
ock.
func
isInitializedUnsynced
(
path
string
)
bool
{
configFilename
,
err
:=
config
.
Filename
(
path
)
if
err
!=
nil
{
...
...
repo/fsrepo/
lock
.go
→
repo/fsrepo/
opener/counter
.go
浏览文件 @
89afdabb
...
...
@@ -5,7 +5,7 @@ import (
"sync"
)
type
packageLock
struct
{
type
Counter
struct
{
// lock protects repos
lock
sync
.
Mutex
// repos maps repo paths to the number of openers holding an FSRepo handle
...
...
@@ -13,39 +13,39 @@ type packageLock struct {
repos
map
[
string
]
int
}
func
makePackageLock
()
*
packageLock
{
return
&
packageLock
{
func
NewCounter
()
*
Counter
{
return
&
Counter
{
repos
:
make
(
map
[
string
]
int
),
}
}
// Lock must be held to while performing any operation that modifies an
// FSRepo's state field. This includes Init, Open, Close, and Remove.
func
(
l
*
packageLock
)
Lock
()
{
func
(
l
*
Counter
)
Lock
()
{
l
.
lock
.
Lock
()
}
func
(
l
*
packageLock
)
Unlock
()
{
func
(
l
*
Counter
)
Unlock
()
{
l
.
lock
.
Unlock
()
}
// NumOpeners returns the number of FSRepos holding a handle to the repo at
// this path. This method is not thread-safe. The caller must have this object
// locked.
func
(
l
*
packageLock
)
NumOpeners
(
repoPath
string
)
int
{
func
(
l
*
Counter
)
NumOpeners
(
repoPath
string
)
int
{
return
l
.
repos
[
key
(
repoPath
)]
}
// AddOpener messages that an FSRepo holds a handle to the repo at this path.
// This method is not thread-safe. The caller must have this object locked.
func
(
l
*
packageLock
)
AddOpener
(
repoPath
string
)
{
func
(
l
*
Counter
)
AddOpener
(
repoPath
string
)
{
l
.
repos
[
key
(
repoPath
)]
++
}
// RemoveOpener messgaes that an FSRepo no longer holds a handle to the repo at
// this path. This method is not thread-safe. The caller must have this object
// locked.
func
(
l
*
packageLock
)
RemoveOpener
(
repoPath
string
)
{
func
(
l
*
Counter
)
RemoveOpener
(
repoPath
string
)
{
l
.
repos
[
key
(
repoPath
)]
--
}
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论