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
c157e5fd
Commit
c157e5fd
authored
Feb 01, 2011
by
Poul-Henning Kamp
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Polishing the object allocation code and persistence a bit
parent
d6210a9f
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
49 additions
and
57 deletions
+49
-57
stevedore.c
bin/varnishd/stevedore.c
+13
-6
storage_persistent.c
bin/varnishd/storage_persistent.c
+34
-49
persistent.h
include/persistent.h
+2
-2
No files found.
bin/varnishd/stevedore.c
View file @
c157e5fd
...
...
@@ -176,6 +176,9 @@ STV_MkObject(struct sess *sp, void *ptr, unsigned ltot,
CHECK_OBJ_NOTNULL
(
soc
,
STV_OBJ_SECRETES_MAGIC
);
assert
(
PAOK
(
ptr
));
assert
(
PAOK
(
soc
->
wsl
));
assert
(
PAOK
(
soc
->
lhttp
));
assert
(
ltot
>=
sizeof
*
o
+
soc
->
lhttp
+
soc
->
wsl
);
o
=
ptr
;
...
...
@@ -185,12 +188,10 @@ STV_MkObject(struct sess *sp, void *ptr, unsigned ltot,
l
=
PRNDDN
(
ltot
-
(
sizeof
*
o
+
soc
->
lhttp
));
assert
(
l
>=
soc
->
wsl
);
assert
(
PAOK
(
soc
->
wsl
));
assert
(
PAOK
(
soc
->
lhttp
));
o
->
http
=
HTTP_create
(
o
+
1
,
soc
->
nhttp
);
WS_Init
(
o
->
ws_o
,
"obj"
,
(
char
*
)(
o
+
1
)
+
soc
->
lhttp
,
soc
->
wsl
);
WS_Assert
(
o
->
ws_o
);
assert
(
o
->
ws_o
->
e
<=
(
char
*
)
ptr
+
ltot
);
http_Setup
(
o
->
http
,
o
->
ws_o
);
o
->
http
->
magic
=
HTTP_MAGIC
;
...
...
@@ -227,8 +228,12 @@ stv_default_allocobj(struct stevedore *stv, struct sess *sp, unsigned ltot,
CHECK_OBJ_NOTNULL
(
soc
,
STV_OBJ_SECRETES_MAGIC
);
st
=
stv
->
alloc
(
stv
,
ltot
);
XXXAN
(
st
);
xxxassert
(
st
->
space
>=
ltot
);
if
(
st
==
NULL
)
return
(
NULL
);
if
(
st
->
space
<
ltot
)
{
stv
->
free
(
st
);
return
(
NULL
);
}
ltot
=
st
->
len
=
st
->
space
;
o
=
STV_MkObject
(
sp
,
st
->
ptr
,
ltot
,
soc
);
CHECK_OBJ_NOTNULL
(
o
,
OBJECT_MAGIC
);
...
...
@@ -238,7 +243,7 @@ stv_default_allocobj(struct stevedore *stv, struct sess *sp, unsigned ltot,
/*-------------------------------------------------------------------
* Allocate storage for an object, based on the header information.
* XXX: If we know (a hint of) the length, we
sh
ould allocate space
* XXX: If we know (a hint of) the length, we
c
ould allocate space
* XXX: for the body in the same allocation while we are at it.
*/
...
...
@@ -269,6 +274,8 @@ STV_NewObject(struct sess *sp, const char *hint, unsigned wsl, double ttl,
stv
=
stv_pick_stevedore
(
hint
);
AN
(
stv
->
allocobj
);
o
=
stv
->
allocobj
(
stv
,
sp
,
ltot
,
&
soc
);
if
(
o
==
NULL
)
return
(
NULL
);
CHECK_OBJ_NOTNULL
(
o
,
OBJECT_MAGIC
);
CHECK_OBJ_NOTNULL
(
o
->
objstore
,
STORAGE_MAGIC
);
return
(
o
);
...
...
bin/varnishd/storage_persistent.c
View file @
c157e5fd
...
...
@@ -133,7 +133,7 @@ struct smp_sc {
unsigned
granularity
;
uint32_t
unique
;
uint8_t
*
ptr
;
uint8_t
*
base
;
struct
smp_ident
*
ident
;
...
...
@@ -210,7 +210,7 @@ smp_def_sign(const struct smp_sc *sc, struct smp_signctx *ctx,
assert
(
strlen
(
id
)
<
sizeof
ctx
->
ss
->
ident
);
memset
(
ctx
,
0
,
sizeof
ctx
);
ctx
->
ss
=
(
void
*
)(
sc
->
ptr
+
off
);
ctx
->
ss
=
(
void
*
)(
sc
->
base
+
off
);
ctx
->
unique
=
sc
->
unique
;
ctx
->
id
=
id
;
}
...
...
@@ -567,10 +567,10 @@ smp_init(struct stevedore *parent, int ac, char * const *av)
AZ
(
ftruncate
(
sc
->
fd
,
sc
->
mediasize
));
sc
->
ptr
=
mmap
(
NULL
,
sc
->
mediasize
,
PROT_READ
|
PROT_WRITE
,
sc
->
base
=
mmap
(
NULL
,
sc
->
mediasize
,
PROT_READ
|
PROT_WRITE
,
MAP_NOCORE
|
MAP_NOSYNC
|
MAP_SHARED
,
sc
->
fd
,
0
);
if
(
sc
->
ptr
==
MAP_FAILED
)
if
(
sc
->
base
==
MAP_FAILED
)
ARGV_ERR
(
"(-spersistent) failed to mmap (%s)
\n
"
,
strerror
(
errno
));
...
...
@@ -914,7 +914,7 @@ smp_load_seg(const struct sess *sp, const struct smp_sc *sc, struct smp_seg *sg)
smp_def_sign
(
sc
,
ctx
,
sg
->
p
.
offset
,
"SEGHEAD"
);
if
(
smp_chk_sign
(
ctx
))
return
;
so
=
(
void
*
)(
sc
->
ptr
+
sg
->
p
.
objlist
);
so
=
(
void
*
)(
sc
->
base
+
sg
->
p
.
objlist
);
sg
->
objs
=
so
;
sg
->
nalloc2
=
sg
->
p
.
nalloc
;
no
=
sg
->
p
.
nalloc
;
...
...
@@ -1144,7 +1144,7 @@ smp_new_seg(struct smp_sc *sc)
sg
->
next_addr
=
sg
->
p
.
offset
+
sizeof
(
struct
smp_sign
)
+
// XXX use macro
SHA256_LEN
;
memcpy
(
sc
->
ptr
+
sg
->
next_addr
,
"HERE"
,
4
);
memcpy
(
sc
->
base
+
sg
->
next_addr
,
"HERE"
,
4
);
sc
->
objreserv
=
0
;
}
...
...
@@ -1188,7 +1188,7 @@ smp_close_seg(struct smp_sc *sc, struct smp_seg *sg)
sg
->
p
.
objlist
=
sg
->
next_addr
;
sg
->
p
.
nalloc
=
sg
->
nalloc1
;
p
=
(
void
*
)(
sc
->
ptr
+
sg
->
next_addr
);
p
=
(
void
*
)(
sc
->
base
+
sg
->
next_addr
);
sg
->
next_addr
+=
C_ALIGN
(
sc
->
objreserv
);
memcpy
(
p
,
sg
->
objs
,
sc
->
objreserv
);
...
...
@@ -1258,7 +1258,7 @@ smp_open(const struct stevedore *st)
/* We trust the parent to give us a valid silo, for good measure: */
AZ
(
smp_valid_silo
(
sc
));
AZ
(
mprotect
(
sc
->
ptr
,
4096
,
PROT_READ
));
AZ
(
mprotect
(
sc
->
base
,
4096
,
PROT_READ
));
sc
->
ident
=
SIGN_DATA
(
&
sc
->
idn
);
...
...
@@ -1378,15 +1378,15 @@ smp_allocx(struct stevedore *st, size_t size, struct smp_seg **sgp)
assert
(
needed
<=
smp_spaceleft
(
sg
));
/* Grab for storage struct */
ss
=
(
void
*
)(
sc
->
ptr
+
sg
->
next_addr
);
ss
=
(
void
*
)(
sc
->
base
+
sg
->
next_addr
);
sg
->
next_addr
+=
C_ALIGN
(
sizeof
*
ss
);
/* Grab for allocated space */
allocation
=
sc
->
ptr
+
sg
->
next_addr
;
allocation
=
sc
->
base
+
sg
->
next_addr
;
sg
->
next_addr
+=
size
;
/* Paint our marker */
memcpy
(
sc
->
ptr
+
sg
->
next_addr
,
"HERE"
,
4
);
memcpy
(
sc
->
base
+
sg
->
next_addr
,
"HERE"
,
4
);
if
(
sgp
!=
NULL
)
{
/* Make reservation in the index */
...
...
@@ -1411,7 +1411,7 @@ smp_allocx(struct stevedore *st, size_t size, struct smp_seg **sgp)
// XXX: wrong: ss->where = sg->next_addr + sizeof *ss;
assert
((
uintmax_t
)
ss
->
space
==
(
uintmax_t
)
size
);
assert
((
char
*
)
ss
->
ptr
>
(
char
*
)
ss
);
assert
((
char
*
)
ss
->
ptr
+
ss
->
space
<=
(
char
*
)
sc
->
ptr
+
sc
->
mediasize
);
assert
((
char
*
)
ss
->
ptr
+
ss
->
space
<=
(
char
*
)
sc
->
base
+
sc
->
mediasize
);
return
(
ss
);
}
...
...
@@ -1442,6 +1442,10 @@ smp_allocobj(struct stevedore *stv, struct sess *sp, unsigned ltot,
st
=
smp_allocx
(
stv
,
ltot
,
&
sg
);
if
(
st
==
NULL
)
return
(
NULL
);
if
(
st
->
space
<
ltot
)
{
// XXX: smp_free(st);
return
(
NULL
);
}
assert
(
st
->
space
>=
ltot
);
ltot
=
st
->
len
=
st
->
space
;
...
...
@@ -1463,7 +1467,7 @@ smp_allocobj(struct stevedore *stv, struct sess *sp, unsigned ltot,
sg
->
nobj
++
;
assert
(
sizeof
so
->
hash
==
DIGEST_LEN
);
memcpy
(
so
->
hash
,
oc
->
objhead
->
digest
,
DIGEST_LEN
);
so
->
ttl
=
o
->
ttl
;
so
->
ttl
=
o
->
ttl
;
/* XXX: grace? */
so
->
ptr
=
o
;
so
->
ban
=
o
->
ban_t
;
...
...
@@ -1486,40 +1490,24 @@ smp_alloc(struct stevedore *st, size_t size)
return
(
smp_allocx
(
st
,
size
,
NULL
));
}
/*--------------------------------------------------------------------
* Trim a bite
* XXX: We could trim the last allocation.
*/
static
void
smp_trim
(
struct
storage
*
ss
,
size_t
size
)
{
struct
smp_sc
*
sc
;
struct
smp_seg
*
sg
;
const
char
z
[
4
]
=
{
0
,
0
,
0
,
0
};
return
;
CAST_OBJ_NOTNULL
(
sc
,
ss
->
priv
,
SMP_SC_MAGIC
);
/* We want 16 bytes alignment */
size
|=
0xf
;
size
+=
1
;
sg
=
sc
->
cur_seg
;
if
(
ss
->
ptr
+
ss
->
space
!=
sg
->
next_addr
+
sc
->
ptr
)
return
;
Lck_Lock
(
&
sc
->
mtx
);
sg
=
sc
->
cur_seg
;
if
(
ss
->
ptr
+
ss
->
space
==
sg
->
next_addr
+
sc
->
ptr
)
{
memcpy
(
sc
->
ptr
+
sg
->
next_addr
,
z
,
4
);
sg
->
next_addr
-=
ss
->
space
-
size
;
ss
->
space
=
size
;
memcpy
(
sc
->
ptr
+
sg
->
next_addr
,
"HERE"
,
4
);
}
Lck_Unlock
(
&
sc
->
mtx
);
(
void
)
ss
;
(
void
)
size
;
}
/*--------------------------------------------------------------------
* We don't track frees of storage, we track the objects which own them
* instead, when there are no more objects in in the first segment, it
* can be reclaimed.
* We don't track frees of storage, we track the objects which own the
* storage and when there are no more objects in in the first segment,
* it can be reclaimed.
* XXX: We could free the last allocation, but does that happen ?
*/
static
void
__match_proto__
(
storage_free_f
)
...
...
@@ -1540,16 +1528,13 @@ SMP_Ready(void)
struct
smp_sc
*
sc
;
ASSERT_CLI
();
while
(
1
)
{
VTAILQ_FOREACH
(
sc
,
&
silos
,
list
)
{
if
(
sc
->
flags
&
SMP_F_LOADED
)
continue
;
do
{
VTAILQ_FOREACH
(
sc
,
&
silos
,
list
)
if
(
!
(
sc
->
flags
&
SMP_F_LOADED
))
break
;
if
(
sc
!=
NULL
)
(
void
)
sleep
(
1
);
break
;
}
if
(
sc
==
NULL
)
break
;
}
}
while
(
sc
!=
NULL
);
}
/*--------------------------------------------------------------------*/
...
...
include/persistent.h
View file @
c157e5fd
...
...
@@ -44,11 +44,11 @@
* sha256[...] checksum of same
*
* struct smp_sign;
* struct smp_segment_1[N]; Segment table
* struct smp_segment_1[N];
First
Segment table
* sha256[...] checksum of same
*
* struct smp_sign;
* struct smp_segment_2[N]; Segment table
* struct smp_segment_2[N]; Se
cond Se
gment table
* sha256[...] checksum of same
*
* N segments {
...
...
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