Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
梦中观雨
cat
提交
dd622f76
C
cat
项目概览
梦中观雨
/
cat
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
C
cat
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
dd622f76
编写于
2月 22, 2012
作者:
F
Frankie Wu
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
make Bucket impl thread-safe
上级
8daf9f2d
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
68 addition
and
31 deletion
+68
-31
cat-core/src/main/java/com/dianping/cat/storage/internal/AbstractFileBucket.java
...com/dianping/cat/storage/internal/AbstractFileBucket.java
+66
-29
cat-core/src/main/java/com/dianping/cat/storage/internal/DefaultBucket.java
...java/com/dianping/cat/storage/internal/DefaultBucket.java
+1
-1
cat-core/src/main/java/com/dianping/cat/storage/internal/DefaultMessageBucket.java
...m/dianping/cat/storage/internal/DefaultMessageBucket.java
+1
-1
未找到文件。
cat-core/src/main/java/com/dianping/cat/storage/internal/AbstractBucket.java
→
cat-core/src/main/java/com/dianping/cat/storage/internal/Abstract
File
Bucket.java
浏览文件 @
dd622f76
...
...
@@ -8,6 +8,9 @@ import java.util.Collections;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.concurrent.locks.ReentrantReadWriteLock
;
import
java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock
;
import
java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock
;
import
org.codehaus.plexus.logging.LogEnabled
;
import
org.codehaus.plexus.logging.Logger
;
...
...
@@ -20,7 +23,7 @@ import com.site.helper.Joiners;
import
com.site.helper.Splitters
;
import
com.site.lookup.annotation.Inject
;
public
abstract
class
AbstractBucket
<
T
>
implements
Bucket
<
T
>,
TagThreadSupport
<
T
>,
LogEnabled
{
public
abstract
class
Abstract
File
Bucket
<
T
>
implements
Bucket
<
T
>,
TagThreadSupport
<
T
>,
LogEnabled
{
private
static
final
String
[]
EMPTY
=
new
String
[
0
];
@Inject
...
...
@@ -38,14 +41,22 @@ public abstract class AbstractBucket<T> implements Bucket<T>, TagThreadSupport<T
private
Logger
m_logger
;
private
ReadLock
m_readLock
;
private
WriteLock
m_writeLock
;
@Override
public
void
close
()
{
m_writeLock
.
lock
();
try
{
m_out
.
close
();
m_idToOffsets
.
clear
();
m_tagToIds
.
clear
();
}
catch
(
IOException
e
)
{
// ignore it
}
finally
{
m_writeLock
.
unlock
();
}
}
...
...
@@ -85,6 +96,8 @@ public abstract class AbstractBucket<T> implements Bucket<T>, TagThreadSupport<T
Long
offset
=
m_idToOffsets
.
get
(
id
);
if
(
offset
!=
null
)
{
m_readLock
.
lock
();
try
{
long
old
=
m_out
.
getFilePointer
();
...
...
@@ -104,6 +117,8 @@ public abstract class AbstractBucket<T> implements Bucket<T>, TagThreadSupport<T
return
data
;
}
catch
(
Exception
e
)
{
m_logger
.
error
(
String
.
format
(
"Error when reading file(%s)!"
,
m_file
),
e
);
}
finally
{
m_readLock
.
unlock
();
}
}
...
...
@@ -138,49 +153,58 @@ public abstract class AbstractBucket<T> implements Bucket<T>, TagThreadSupport<T
@Override
public
void
initialize
(
Class
<?>
type
,
String
path
)
throws
IOException
{
ReentrantReadWriteLock
lock
=
new
ReentrantReadWriteLock
();
m_readLock
=
lock
.
readLock
();
m_writeLock
=
lock
.
writeLock
();
m_file
=
new
File
(
m_baseDir
,
path
);
m_file
.
getParentFile
().
mkdirs
();
m_out
=
new
RandomAccessFile
(
m_file
,
"rw"
);
if
(
m_file
.
exists
())
{
loadIndexes
();
m_out
.
seek
(
m_out
.
length
());
}
}
protected
void
loadIndexes
()
throws
IOException
{
byte
[]
data
=
new
byte
[
8192
];
while
(
true
)
{
long
offset
=
m_out
.
getFilePointer
();
String
first
=
m_out
.
readLine
();
m_writeLock
.
lock
();
if
(
first
==
null
)
{
// EOF
break
;
}
try
{
while
(
true
)
{
long
offset
=
m_out
.
getFilePointer
();
String
first
=
m_out
.
readLine
();
int
num
=
Integer
.
parseInt
(
m_out
.
readLine
());
if
(
first
==
null
)
{
// EOF
break
;
}
if
(
num
>
data
.
length
)
{
int
newSize
=
data
.
length
;
int
num
=
Integer
.
parseInt
(
m_out
.
readLine
());
while
(
newSize
<
num
)
{
newSize
+=
newSize
/
2
;
}
if
(
num
>
data
.
length
)
{
int
newSize
=
data
.
length
;
data
=
new
byte
[
newSize
];
}
while
(
newSize
<
num
)
{
newSize
+=
newSize
/
2
;
}
data
=
new
byte
[
newSize
];
}
m_out
.
readFully
(
data
,
0
,
num
);
// get rid of it
m_out
.
readLine
();
// get rid of empty line
m_out
.
readFully
(
data
,
0
,
num
);
// get rid of it
m_out
.
readLine
();
// get rid of empty line
List
<
String
>
parts
=
Splitters
.
by
(
'\t'
).
split
(
first
);
if
(
parts
.
size
()
>
0
)
{
String
id
=
parts
.
get
(
0
);
List
<
String
>
parts
=
Splitters
.
by
(
'\t'
).
split
(
first
);
if
(
parts
.
size
()
>
0
)
{
String
id
=
parts
.
get
(
0
);
parts
.
remove
(
0
);
updateIndex
(
id
,
parts
.
toArray
(
EMPTY
),
offset
);
parts
.
remove
(
0
);
updateIndex
(
id
,
parts
.
toArray
(
EMPTY
),
offset
);
}
}
}
finally
{
m_writeLock
.
unlock
();
}
}
...
...
@@ -200,16 +224,27 @@ public abstract class AbstractBucket<T> implements Bucket<T>, TagThreadSupport<T
*/
@Override
public
boolean
storeById
(
String
id
,
T
data
,
String
...
tags
)
{
try
{
ChannelBuffer
buf
=
ChannelBuffers
.
dynamicBuffer
(
8192
);
ChannelBuffer
buf
=
ChannelBuffers
.
dynamicBuffer
(
8192
);
String
attributes
=
id
+
"\t"
+
Joiners
.
by
(
'\t'
).
join
(
tags
)
+
"\n"
;
byte
[]
first
;
byte
[]
num
;
int
length
;
try
{
encode
(
data
,
buf
);
int
length
=
buf
.
readInt
();
String
attributes
=
id
+
"\t"
+
Joiners
.
by
(
'\t'
).
join
(
tags
)
+
"\n"
;
length
=
buf
.
readInt
();
first
=
attributes
.
getBytes
(
"utf-8"
);
num
=
String
.
valueOf
(
length
).
getBytes
(
"utf-8"
);
}
catch
(
Exception
e
)
{
m_logger
.
error
(
String
.
format
(
"Error when preparing to write to file(%s)!"
,
m_file
),
e
);
return
false
;
}
m_writeLock
.
lock
();
byte
[]
first
=
attributes
.
getBytes
(
"utf-8"
);
byte
[]
num
=
String
.
valueOf
(
length
).
getBytes
(
"utf-8"
);
try
{
long
offset
=
m_out
.
getFilePointer
();
m_out
.
write
(
first
);
...
...
@@ -226,6 +261,8 @@ public abstract class AbstractBucket<T> implements Bucket<T>, TagThreadSupport<T
m_logger
.
error
(
String
.
format
(
"Error when writing to file(%s)!"
,
m_file
),
e
);
return
false
;
}
finally
{
m_writeLock
.
unlock
();
}
}
...
...
cat-core/src/main/java/com/dianping/cat/storage/internal/DefaultBucket.java
浏览文件 @
dd622f76
...
...
@@ -5,7 +5,7 @@ import java.nio.charset.Charset;
import
org.jboss.netty.buffer.ChannelBuffer
;
public
class
DefaultBucket
<
T
>
extends
AbstractBucket
<
T
>
{
public
class
DefaultBucket
<
T
>
extends
Abstract
File
Bucket
<
T
>
{
private
Class
<?>
m_type
;
@SuppressWarnings
(
"unchecked"
)
...
...
cat-core/src/main/java/com/dianping/cat/storage/internal/DefaultMessageBucket.java
浏览文件 @
dd622f76
...
...
@@ -10,7 +10,7 @@ import com.dianping.cat.message.spi.internal.DefaultMessageTree;
import
com.dianping.cat.storage.MessageBucket
;
import
com.site.lookup.annotation.Inject
;
public
class
DefaultMessageBucket
extends
AbstractBucket
<
MessageTree
>
implements
MessageBucket
{
public
class
DefaultMessageBucket
extends
Abstract
File
Bucket
<
MessageTree
>
implements
MessageBucket
{
@Inject
private
MessageCodec
m_codec
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录