Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
varnish-cache
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Commits
Open sidebar
varnishcache
varnish-cache
Commits
a0e4bab9
Commit
a0e4bab9
authored
Aug 01, 2019
by
Poul-Henning Kamp
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Introduce '-' records in VSM _.index files, to reduce VFS workload.
parent
5f97b89a
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
71 additions
and
12 deletions
+71
-12
common_vsmw.c
bin/varnishd/common/common_vsmw.c
+34
-11
vsm.c
lib/libvarnishapi/vsm.c
+37
-1
No files found.
bin/varnishd/common/common_vsmw.c
View file @
a0e4bab9
...
...
@@ -112,6 +112,8 @@ struct vsmw {
struct
vsb
*
vsb
;
pid_t
pid
;
time_t
birth
;
uint64_t
nsegs
;
uint64_t
nsubs
;
};
/*--------------------------------------------------------------------*/
...
...
@@ -127,12 +129,14 @@ vsmw_idx_head(const struct vsmw *vsmw, int fd)
}
static
void
vsmw_fmt_index
(
const
struct
vsmw
*
vsmw
,
const
struct
vsmwseg
*
seg
)
vsmw_fmt_index
(
const
struct
vsmw
*
vsmw
,
const
struct
vsmwseg
*
seg
,
char
act
)
{
CHECK_OBJ_NOTNULL
(
vsmw
,
VSMW_MAGIC
);
CHECK_OBJ_NOTNULL
(
seg
,
VSMWSEG_MAGIC
);
VSB_printf
(
vsmw
->
vsb
,
"+ %s %zu %zu %s %s
\n
"
,
AN
(
seg
->
cluster
);
VSB_printf
(
vsmw
->
vsb
,
"%c %s %zu %zu %s %s
\n
"
,
act
,
seg
->
cluster
->
fn
,
seg
->
off
,
seg
->
len
,
...
...
@@ -166,18 +170,31 @@ vsmw_mkent(const struct vsmw *vsmw, const char *pfx)
/*--------------------------------------------------------------------*/
static
void
vsmw_a
ddseg
(
struct
vsmw
*
vsmw
,
struct
vsmwseg
*
seg
)
vsmw_a
ppend_record
(
struct
vsmw
*
vsmw
,
struct
vsmwseg
*
seg
,
char
act
)
{
int
fd
;
VTAILQ_INSERT_TAIL
(
&
vsmw
->
segs
,
seg
,
list
);
CHECK_OBJ_NOTNULL
(
vsmw
,
VSMW_MAGIC
);
CHECK_OBJ_NOTNULL
(
seg
,
VSMWSEG_MAGIC
);
fd
=
openat
(
vsmw
->
vdirfd
,
vsmw
->
idx
,
O_APPEND
|
O_WRONLY
);
assert
(
fd
>=
0
);
VSB_clear
(
vsmw
->
vsb
);
vsmw_fmt_index
(
vsmw
,
seg
);
vsmw_fmt_index
(
vsmw
,
seg
,
act
);
AZ
(
VSB_finish
(
vsmw
->
vsb
));
XXXAZ
(
VSB_tofile
(
fd
,
vsmw
->
vsb
));
// XXX handle ENOSPC? #2764
closefd
(
&
fd
);
vsmw
->
nsegs
++
;
}
/*--------------------------------------------------------------------*/
static
void
vsmw_addseg
(
struct
vsmw
*
vsmw
,
struct
vsmwseg
*
seg
)
{
VTAILQ_INSERT_TAIL
(
&
vsmw
->
segs
,
seg
,
list
);
vsmw_append_record
(
vsmw
,
seg
,
'+'
);
vsmw
->
nsegs
++
;
}
/*--------------------------------------------------------------------*/
...
...
@@ -187,16 +204,19 @@ vsmw_delseg(struct vsmw *vsmw, struct vsmwseg *seg, int fixidx)
{
char
*
t
=
NULL
;
int
fd
;
struct
vsmwseg
*
s2
;
CHECK_OBJ_NOTNULL
(
vsmw
,
VSMW_MAGIC
);
CHECK_OBJ_NOTNULL
(
seg
,
VSMWSEG_MAGIC
);
VTAILQ_REMOVE
(
&
vsmw
->
segs
,
seg
,
list
);
REPLACE
(
seg
->
class
,
NULL
);
REPLACE
(
seg
->
id
,
NULL
);
FREE_OBJ
(
seg
);
if
(
fixidx
)
{
vsmw
->
nsegs
--
;
if
(
vsmw
->
nsubs
<
vsmw
->
nsegs
||
!
fixidx
)
{
vsmw_append_record
(
vsmw
,
seg
,
'-'
);
vsmw
->
nsubs
++
;
}
else
{
vsmw
->
nsubs
=
0
;
vsmw_mkent
(
vsmw
,
vsmw
->
idx
);
REPLACE
(
t
,
VSB_data
(
vsmw
->
vsb
));
AN
(
t
);
...
...
@@ -205,14 +225,17 @@ vsmw_delseg(struct vsmw *vsmw, struct vsmwseg *seg, int fixidx)
assert
(
fd
>=
0
);
vsmw_idx_head
(
vsmw
,
fd
);
VSB_clear
(
vsmw
->
vsb
);
VTAILQ_FOREACH
(
s
eg
,
&
vsmw
->
segs
,
list
)
vsmw_fmt_index
(
vsmw
,
s
eg
);
VTAILQ_FOREACH
(
s
2
,
&
vsmw
->
segs
,
list
)
vsmw_fmt_index
(
vsmw
,
s
2
,
'+'
);
AZ
(
VSB_finish
(
vsmw
->
vsb
));
XXXAZ
(
VSB_tofile
(
fd
,
vsmw
->
vsb
));
// XXX handle ENOSPC? #2764
closefd
(
&
fd
);
AZ
(
renameat
(
vsmw
->
vdirfd
,
t
,
vsmw
->
vdirfd
,
vsmw
->
idx
));
REPLACE
(
t
,
NULL
);
}
REPLACE
(
seg
->
class
,
NULL
);
REPLACE
(
seg
->
id
,
NULL
);
FREE_OBJ
(
seg
);
}
/*--------------------------------------------------------------------*/
...
...
lib/libvarnishapi/vsm.c
View file @
a0e4bab9
...
...
@@ -463,7 +463,7 @@ vsm_vlu_plus(struct vsm *vd, struct vsm_set *vs, const char *line)
if
(
av
[
0
]
!=
NULL
||
ac
<
4
||
ac
>
6
)
{
(
void
)(
vsm_diag
(
vd
,
"vsm_
refresh_set2
: bad index (%d/%s)"
,
"vsm_
vlu_plus
: bad index (%d/%s)"
,
ac
,
av
[
0
]));
VAV_Free
(
av
);
return
(
-
1
);
...
...
@@ -496,6 +496,39 @@ vsm_vlu_plus(struct vsm *vd, struct vsm_set *vs, const char *line)
return
(
0
);
}
static
int
vsm_vlu_minus
(
struct
vsm
*
vd
,
struct
vsm_set
*
vs
,
const
char
*
line
)
{
char
**
av
;
int
ac
;
struct
vsm_seg
*
vg
,
*
vg2
;
av
=
VAV_Parse
(
line
+
1
,
&
ac
,
0
);
if
(
av
[
0
]
!=
NULL
||
ac
<
4
||
ac
>
6
)
{
(
void
)(
vsm_diag
(
vd
,
"vsm_vlu_minus: bad index (%d/%s)"
,
ac
,
av
[
0
]));
VAV_Free
(
av
);
return
(
-
1
);
}
VTAILQ_FOREACH_SAFE
(
vg
,
&
vs
->
segs
,
list
,
vg2
)
{
if
(
vsm_cmp_av
(
&
vg
->
av
[
1
],
&
av
[
1
]))
continue
;
VTAILQ_REMOVE
(
&
vs
->
segs
,
vg
,
list
);
if
(
vg
->
refs
)
{
vg
->
flags
|=
VSM_FLAG_STALE
;
VTAILQ_INSERT_TAIL
(
&
vs
->
stale
,
vg
,
list
);
}
else
{
VAV_Free
(
vg
->
av
);
FREE_OBJ
(
vg
);
}
break
;
}
return
(
0
);
}
static
int
v_matchproto_
(
vlu_f
)
vsm_vlu_func
(
void
*
priv
,
const
char
*
line
)
{
...
...
@@ -519,6 +552,9 @@ vsm_vlu_func(void *priv, const char *line)
case
'+'
:
i
=
vsm_vlu_plus
(
vd
,
vs
,
line
);
break
;
case
'-'
:
i
=
vsm_vlu_minus
(
vd
,
vs
,
line
);
break
;
default:
break
;
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment