Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Turbo码先生
redis
提交
6671032f
R
redis
项目概览
Turbo码先生
/
redis
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
redis
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
6671032f
编写于
1月 29, 2020
作者:
A
antirez
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
ACL LOG: group similar entries in a given time delta.
上级
61dffd86
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
58 addition
and
3 deletion
+58
-3
src/acl.c
src/acl.c
+58
-3
未找到文件。
src/acl.c
浏览文件 @
6671032f
...
...
@@ -1465,6 +1465,7 @@ void ACLLoadUsersAtStartup(void) {
#define ACL_LOG_CTX_TOPLEVEL 0
#define ACL_LOG_CTX_LUA 1
#define ACL_LOG_CTX_MULTI 2
#define ACL_LOG_GROUPING_MAX_TIME_DELTA 60000
/* This structure defines an entry inside the ACL log. */
typedef
struct
ACLLogEntry
{
...
...
@@ -1477,6 +1478,28 @@ typedef struct ACLLogEntry {
sds
cinfo
;
/* Client info (last client if updated). */
}
ACLLogEntry
;
/* This function will check if ACL entries 'a' and 'b' are similar enough
* that we should actually update the existing entry in our ACL log instead
* of creating a new one. */
int
ACLLogMatchEntry
(
ACLLogEntry
*
a
,
ACLLogEntry
*
b
)
{
if
(
a
->
reason
!=
b
->
reason
)
return
0
;
if
(
a
->
context
!=
b
->
context
)
return
0
;
mstime_t
delta
=
a
->
ctime
-
b
->
ctime
;
if
(
delta
<
0
)
delta
=
-
delta
;
if
(
delta
>
ACL_LOG_GROUPING_MAX_TIME_DELTA
)
return
0
;
if
(
sdscmp
(
a
->
object
,
b
->
object
)
!=
0
)
return
0
;
if
(
sdscmp
(
a
->
username
,
b
->
username
)
!=
0
)
return
0
;
return
1
;
}
/* Release an ACL log entry. */
void
ACLFreeLogEntry
(
ACLLogEntry
*
le
)
{
sdsfree
(
le
->
object
);
sdsfree
(
le
->
username
);
sdsfree
(
le
->
cinfo
);
zfree
(
le
);
}
/* Adds a new entry in the ACL log, making sure to delete the old entry
* if we reach the maximum length allowed for the log. This function attempts
* to find similar entries in the current log in order to bump the counter of
...
...
@@ -1504,9 +1527,41 @@ void addACLLogEntry(client *c, int reason, int keypos) {
le
->
context
=
ACL_LOG_CTX_TOPLEVEL
;
}
/* Add it to our list of entires. We'll have to trim the list
* to its maximum size. */
listAddNodeHead
(
ACLLog
,
le
);
/* Try to match this entry with past ones, to see if we can just
* update an existing entry instead of creating a new one. */
long
toscan
=
10
;
/* Do a limited work trying to find duplicated. */
listIter
li
;
listNode
*
ln
;
listRewind
(
ACLLog
,
&
li
);
ACLLogEntry
*
match
=
NULL
;
while
(
toscan
--
&&
(
ln
=
listNext
(
&
li
))
!=
NULL
)
{
ACLLogEntry
*
current
=
listNodeValue
(
ln
);
if
(
ACLLogMatchEntry
(
current
,
le
))
{
match
=
current
;
listDelNode
(
ACLLog
,
ln
);
listAddNodeHead
(
ACLLog
,
current
);
break
;
}
}
/* If there is a match update the entry, otherwise add it as a
* new one. */
if
(
match
)
{
/* We update a few fields of the existing entry and bump the
* counter of events for this entry. */
sdsfree
(
match
->
cinfo
);
match
->
cinfo
=
le
->
cinfo
;
match
->
ctime
=
le
->
ctime
;
match
->
count
++
;
/* Release the old entry. */
le
->
cinfo
=
NULL
;
ACLFreeLogEntry
(
le
);
}
else
{
/* Add it to our list of entires. We'll have to trim the list
* to its maximum size. */
listAddNodeHead
(
ACLLog
,
le
);
}
}
/* =============================================================================
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录