Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
U
unique-xids
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
uplex-varnish
unique-xids
Commits
c4c9db06
Commit
c4c9db06
authored
Feb 08, 2011
by
Poul-Henning Kamp
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Split management process functions into their own source file
parent
0cca0bf8
Changes
4
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
39 additions
and
1551 deletions
+39
-1551
Makefile.am
bin/varnishd/Makefile.am
+1
-0
storage_persistent.c
bin/varnishd/storage_persistent.c
+5
-154
storage_persistent.h
bin/varnishd/storage_persistent.h
+31
-0
storage_persistent_mgt.c
bin/varnishd/storage_persistent_mgt.c
+2
-1397
No files found.
bin/varnishd/Makefile.am
View file @
c4c9db06
...
@@ -64,6 +64,7 @@ varnishd_SOURCES = \
...
@@ -64,6 +64,7 @@ varnishd_SOURCES = \
storage_file.c
\
storage_file.c
\
storage_malloc.c
\
storage_malloc.c
\
storage_persistent.c
\
storage_persistent.c
\
storage_persistent_mgt.c
\
storage_synth.c
\
storage_synth.c
\
storage_umem.c
\
storage_umem.c
\
stevedore_utils.c
\
stevedore_utils.c
\
...
...
bin/varnishd/storage_persistent.c
View file @
c4c9db06
...
@@ -79,7 +79,7 @@ static VTAILQ_HEAD(,smp_sc) silos = VTAILQ_HEAD_INITIALIZER(silos);
...
@@ -79,7 +79,7 @@ static VTAILQ_HEAD(,smp_sc) silos = VTAILQ_HEAD_INITIALIZER(silos);
* Define a signature by location and identifier.
* Define a signature by location and identifier.
*/
*/
static
void
void
smp_def_sign
(
const
struct
smp_sc
*
sc
,
struct
smp_signctx
*
ctx
,
smp_def_sign
(
const
struct
smp_sc
*
sc
,
struct
smp_signctx
*
ctx
,
uint64_t
off
,
const
char
*
id
)
uint64_t
off
,
const
char
*
id
)
{
{
...
@@ -195,28 +195,14 @@ smp_new_sign(const struct smp_sc *sc, struct smp_signctx *ctx,
...
@@ -195,28 +195,14 @@ smp_new_sign(const struct smp_sc *sc, struct smp_signctx *ctx,
smp_sync_sign
(
ctx
);
smp_sync_sign
(
ctx
);
}
}
/*--------------------------------------------------------------------
* Caculate payload of some stuff
*/
static
uint64_t
smp_stuff_len
(
const
struct
smp_sc
*
sc
,
unsigned
stuff
)
{
uint64_t
l
;
assert
(
stuff
<
SMP_END_STUFF
);
l
=
sc
->
ident
->
stuff
[
stuff
+
1
]
-
sc
->
ident
->
stuff
[
stuff
];
l
-=
SMP_SIGN_SPACE
;
return
(
l
);
}
/*-------------------------------------------------------------------
-
/*-------------------------------------------------------------------
:e
* Initialize a Silo with a valid but empty structure.
* Initialize a Silo with a valid but empty structure.
*
*
* XXX: more intelligent sizing of things.
* XXX: more intelligent sizing of things.
*/
*/
static
void
void
smp_newsilo
(
struct
smp_sc
*
sc
)
smp_newsilo
(
struct
smp_sc
*
sc
)
{
{
struct
smp_ident
*
si
;
struct
smp_ident
*
si
;
...
@@ -265,7 +251,7 @@ smp_newsilo(struct smp_sc *sc)
...
@@ -265,7 +251,7 @@ smp_newsilo(struct smp_sc *sc)
* Check if a silo is valid.
* Check if a silo is valid.
*/
*/
static
int
int
smp_valid_silo
(
struct
smp_sc
*
sc
)
smp_valid_silo
(
struct
smp_sc
*
sc
)
{
{
struct
smp_ident
*
si
;
struct
smp_ident
*
si
;
...
@@ -332,141 +318,6 @@ smp_valid_silo(struct smp_sc *sc)
...
@@ -332,141 +318,6 @@ smp_valid_silo(struct smp_sc *sc)
return
(
0
);
return
(
0
);
}
}
/*--------------------------------------------------------------------
* Calculate cleaner metrics from silo dimensions
*/
static
void
smp_metrics
(
struct
smp_sc
*
sc
)
{
/*
* We do not want to loose too big chunks of the silos
* content when we are forced to clean a segment.
*
* For now insist that a segment covers no more than 1% of the silo.
*
* XXX: This should possibly depend on the size of the silo so
* XXX: trivially small silos do not run into trouble along
* XXX: the lines of "one object per segment".
*/
sc
->
min_nseg
=
10
;
sc
->
max_segl
=
smp_stuff_len
(
sc
,
SMP_SPC_STUFF
)
/
sc
->
min_nseg
;
fprintf
(
stderr
,
"min_nseg = %u, max_segl = %ju
\n
"
,
sc
->
min_nseg
,
(
uintmax_t
)
sc
->
max_segl
);
/*
* The number of segments are limited by the size of the segment
* table(s) and from that follows the minimum size of a segmement.
*/
sc
->
max_nseg
=
smp_stuff_len
(
sc
,
SMP_SEG1_STUFF
)
/
sc
->
min_nseg
;
sc
->
min_segl
=
smp_stuff_len
(
sc
,
SMP_SPC_STUFF
)
/
sc
->
max_nseg
;
while
(
sc
->
min_segl
<
sizeof
(
struct
object
))
{
sc
->
max_nseg
/=
2
;
sc
->
min_segl
=
smp_stuff_len
(
sc
,
SMP_SPC_STUFF
)
/
sc
->
max_nseg
;
}
fprintf
(
stderr
,
"max_nseg = %u, min_segl = %ju
\n
"
,
sc
->
max_nseg
,
(
uintmax_t
)
sc
->
min_segl
);
/*
* Set our initial aim point at the exponential average of the
* two extremes.
*
* XXX: This is a pretty arbitrary choice, but having no idea
* XXX: object count, size distribution or ttl pattern at this
* XXX: point, we have to do something.
*/
sc
->
aim_nseg
=
(
unsigned
)
exp
((
log
(
sc
->
min_nseg
)
+
log
(
sc
->
max_nseg
))
*
.
5
);
sc
->
aim_segl
=
smp_stuff_len
(
sc
,
SMP_SPC_STUFF
)
/
sc
->
aim_nseg
;
fprintf
(
stderr
,
"aim_nseg = %u, aim_segl = %ju
\n
"
,
sc
->
aim_nseg
,
(
uintmax_t
)
sc
->
aim_segl
);
/*
* How much space in the free reserve pool ?
*/
sc
->
free_reserve
=
sc
->
aim_segl
*
10
;
fprintf
(
stderr
,
"free_reserve = %ju
\n
"
,
sc
->
free_reserve
);
}
/*--------------------------------------------------------------------
* Set up persistent storage silo in the master process.
*/
static
void
smp_init
(
struct
stevedore
*
parent
,
int
ac
,
char
*
const
*
av
)
{
struct
smp_sc
*
sc
;
int
i
;
ASSERT_MGT
();
AZ
(
av
[
ac
]);
#define SIZOF(foo) fprintf(stderr, \
"sizeof(%s) = %zu = 0x%zx\n", #foo, sizeof(foo), sizeof(foo));
SIZOF
(
struct
smp_ident
);
SIZOF
(
struct
smp_sign
);
SIZOF
(
struct
smp_segptr
);
SIZOF
(
struct
smp_object
);
#undef SIZOF
/* See comments in persistent.h */
assert
(
sizeof
(
struct
smp_ident
)
==
SMP_IDENT_SIZE
);
/* Allocate softc */
ALLOC_OBJ
(
sc
,
SMP_SC_MAGIC
);
XXXAN
(
sc
);
sc
->
parent
=
parent
;
sc
->
fd
=
-
1
;
VTAILQ_INIT
(
&
sc
->
segments
);
/* Argument processing */
if
(
ac
!=
2
)
ARGV_ERR
(
"(-spersistent) wrong number of arguments
\n
"
);
i
=
STV_GetFile
(
av
[
0
],
&
sc
->
fd
,
&
sc
->
filename
,
"-spersistent"
);
if
(
i
==
2
)
ARGV_ERR
(
"(-spersistent) need filename (not directory)
\n
"
);
sc
->
align
=
sizeof
(
void
*
)
*
2
;
sc
->
granularity
=
getpagesize
();
sc
->
mediasize
=
STV_FileSize
(
sc
->
fd
,
av
[
1
],
&
sc
->
granularity
,
"-spersistent"
);
AZ
(
ftruncate
(
sc
->
fd
,
sc
->
mediasize
));
sc
->
base
=
mmap
(
NULL
,
sc
->
mediasize
,
PROT_READ
|
PROT_WRITE
,
MAP_NOCORE
|
MAP_NOSYNC
|
MAP_SHARED
,
sc
->
fd
,
0
);
if
(
sc
->
base
==
MAP_FAILED
)
ARGV_ERR
(
"(-spersistent) failed to mmap (%s)
\n
"
,
strerror
(
errno
));
smp_def_sign
(
sc
,
&
sc
->
idn
,
0
,
"SILO"
);
sc
->
ident
=
SIGN_DATA
(
&
sc
->
idn
);
i
=
smp_valid_silo
(
sc
);
if
(
i
)
smp_newsilo
(
sc
);
AZ
(
smp_valid_silo
(
sc
));
smp_metrics
(
sc
);
parent
->
priv
=
sc
;
/* XXX: only for sendfile I guess... */
mgt_child_inherit
(
sc
->
fd
,
"storage_persistent"
);
}
/*--------------------------------------------------------------------
/*--------------------------------------------------------------------
* Write the segmentlist back to the silo.
* Write the segmentlist back to the silo.
*
*
...
@@ -1480,7 +1331,7 @@ SMP_Ready(void)
...
@@ -1480,7 +1331,7 @@ SMP_Ready(void)
const
struct
stevedore
smp_stevedore
=
{
const
struct
stevedore
smp_stevedore
=
{
.
magic
=
STEVEDORE_MAGIC
,
.
magic
=
STEVEDORE_MAGIC
,
.
name
=
"persistent"
,
.
name
=
"persistent"
,
.
init
=
smp_init
,
.
init
=
smp_
mgt_
init
,
.
open
=
smp_open
,
.
open
=
smp_open
,
.
close
=
smp_close
,
.
close
=
smp_close
,
.
alloc
=
smp_alloc
,
.
alloc
=
smp_alloc
,
...
...
bin/varnishd/storage_persistent.h
View file @
c4c9db06
...
@@ -173,3 +173,34 @@ struct smp_sc {
...
@@ -173,3 +173,34 @@ struct smp_sc {
#define SIGN_DATA(ctx) ((void *)((ctx)->ss + 1))
#define SIGN_DATA(ctx) ((void *)((ctx)->ss + 1))
#define SIGN_END(ctx) ((void *)((int8_t *)SIGN_DATA(ctx) + (ctx)->ss->length))
#define SIGN_END(ctx) ((void *)((int8_t *)SIGN_DATA(ctx) + (ctx)->ss->length))
/* storage_persistent.c */
void
smp_newsilo
(
struct
smp_sc
*
sc
);
int
smp_valid_silo
(
struct
smp_sc
*
sc
);
void
smp_def_sign
(
const
struct
smp_sc
*
sc
,
struct
smp_signctx
*
ctx
,
uint64_t
off
,
const
char
*
id
);
/* storage_persistent_mgt.c */
void
smp_mgt_init
(
struct
stevedore
*
parent
,
int
ac
,
char
*
const
*
av
);
/*--------------------------------------------------------------------*/
/*--------------------------------------------------------------------
* Caculate payload of some stuff
*/
static
inline
uint64_t
smp_stuff_len
(
const
struct
smp_sc
*
sc
,
unsigned
stuff
)
{
uint64_t
l
;
assert
(
stuff
<
SMP_END_STUFF
);
l
=
sc
->
ident
->
stuff
[
stuff
+
1
]
-
sc
->
ident
->
stuff
[
stuff
];
l
-=
SMP_SIGN_SPACE
;
return
(
l
);
}
bin/varnishd/storage_persistent_mgt.c
View file @
c4c9db06
This diff is collapsed.
Click to expand it.
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