Commit 115742b0 authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

Merge ObjTrimStore into ObjExtend, as aid to #3298

parent ed13c9f2
......@@ -100,7 +100,7 @@ vfp_vep_callback(struct vfp_ctx *vc, void *priv, ssize_t l, enum vgz_flag flg)
VGZ_UpdateObj(vc, vef->vgz, VUA_UPDATE);
if (dl > 0) {
vef->tot += dl;
VFP_Extend(vc, dl);
VFP_Extend(vc, dl, VFP_OK);
}
} while (i != VGZ_ERROR &&
(!VGZ_IbufEmpty(vef->vgz) || VGZ_ObufFull(vef->vgz)));
......
......@@ -517,7 +517,7 @@ vbf_stp_startfetch(struct worker *wrk, struct busyobj *bo)
*/
static enum fetch_step
vbf_stp_fetchbody(struct worker *wrk, struct busyobj *bo)
vbf_stp_fetchbody(const struct worker *wrk, struct busyobj *bo)
{
ssize_t l;
uint8_t *ptr;
......@@ -561,8 +561,8 @@ vbf_stp_fetchbody(struct worker *wrk, struct busyobj *bo)
AZ(vfc->failed);
vfps = VFP_Suck(vfc, ptr, &l);
if (l > 0 && vfps != VFP_ERROR) {
VFP_Extend(vfc, l);
if (l >= 0 && vfps != VFP_ERROR) {
VFP_Extend(vfc, l, vfps);
if (est >= l)
est -= l;
else
......@@ -584,7 +584,6 @@ vbf_stp_fetchbody(struct worker *wrk, struct busyobj *bo)
}
}
ObjTrimStore(wrk, oc);
return (F_STP_FETCHEND);
}
......@@ -729,7 +728,7 @@ vbf_objiterator(void *priv, unsigned flush, const void *ptr, ssize_t len)
if (len < l)
l = len;
memcpy(pd, ps, l);
VFP_Extend(bo->vfc, l);
VFP_Extend(bo->vfc, l, l == len ? VFP_END : VFP_OK);
ps += l;
len -= l;
}
......@@ -929,7 +928,7 @@ vbf_stp_error(struct worker *wrk, struct busyobj *bo)
if (l > ll)
l = ll;
memcpy(ptr, VSB_data(synth_body) + o, l);
VFP_Extend(bo->vfc, l);
VFP_Extend(bo->vfc, l, l == ll ? VFP_END : VFP_OK);
ll -= l;
o += l;
}
......
......@@ -95,11 +95,11 @@ VFP_GetStorage(struct vfp_ctx *vc, ssize_t *sz, uint8_t **ptr)
}
void
VFP_Extend(const struct vfp_ctx *vc, ssize_t sz)
VFP_Extend(const struct vfp_ctx *vc, ssize_t sz, enum vfp_status flg)
{
CHECK_OBJ_NOTNULL(vc, VFP_CTX_MAGIC);
ObjExtend(vc->wrk, vc->oc, sz);
ObjExtend(vc->wrk, vc->oc, sz, flg == VFP_END);
}
/**********************************************************************
......
......@@ -47,7 +47,6 @@
* 2 ObjGetSpace() allocates space
* 2 ObjExtend() commits content
* 2 ObjWaitExtend() waits for content - used to implement ObjIterate())
* 2 ObjTrimStore() signals end of content addition
*
* 2 ObjSetAttr()
* 2 ObjCopyAttr()
......@@ -212,23 +211,33 @@ ObjGetSpace(struct worker *wrk, struct objcore *oc, ssize_t *sz, uint8_t **ptr)
*
* This function extends the used part of the object a number of bytes
* into the last space returned by ObjGetSpace()
*
* The final flag must be set on the last call, and it will release any
* surplus space allocated.
*/
void
ObjExtend(struct worker *wrk, struct objcore *oc, ssize_t l)
ObjExtend(struct worker *wrk, struct objcore *oc, ssize_t l, int final)
{
const struct obj_methods *om = obj_getmethods(oc);
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
CHECK_OBJ_NOTNULL(oc->boc, BOC_MAGIC);
assert(l > 0);
(void)final;
assert(l >= 0);
Lck_Lock(&oc->boc->mtx);
AN(om->objextend);
om->objextend(wrk, oc, l);
oc->boc->len_so_far += l;
if (l > 0) {
om->objextend(wrk, oc, l);
oc->boc->len_so_far += l;
AZ(pthread_cond_broadcast(&oc->boc->cond));
}
Lck_Unlock(&oc->boc->mtx);
AZ(pthread_cond_broadcast(&oc->boc->cond));
assert(oc->boc == NULL || oc->boc->state < BOS_FINISHED);
if (final && om->objtrimstore != NULL)
om->objtrimstore(wrk, oc);
}
/*====================================================================
......@@ -320,26 +329,6 @@ ObjGetLen(struct worker *wrk, struct objcore *oc)
return (len);
}
/*====================================================================
* ObjTrimStore()
*
* Release any surplus space allocated, we promise not to call ObjExtend()
* any more.
*/
void
ObjTrimStore(struct worker *wrk, struct objcore *oc)
{
const struct obj_methods *om = obj_getmethods(oc);
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
assert(oc->boc == NULL || oc->boc->state < BOS_FINISHED);
if (om->objtrimstore != NULL)
om->objtrimstore(wrk, oc);
}
/*====================================================================
* ObjSlim()
*
......
......@@ -124,7 +124,7 @@ vrb_pull(struct req *req, ssize_t maxsize, objiterate_f *func, void *priv)
if (r)
break;
} else {
ObjExtend(req->wrk, req->body_oc, l);
ObjExtend(req->wrk, req->body_oc, l, vfps == VFP_END);
}
}
......@@ -142,7 +142,6 @@ vrb_pull(struct req *req, ssize_t maxsize, objiterate_f *func, void *priv)
return (r);
}
ObjTrimStore(req->wrk, req->body_oc);
AZ(ObjSetU64(req->wrk, req->body_oc, OA_LEN, req_bodybytes));
HSH_DerefBoc(req->wrk, req->body_oc);
......
......@@ -337,7 +337,7 @@ cnt_synth(struct worker *wrk, struct req *req)
if (sz > 0 &&
ObjGetSpace(wrk, req->objcore, &sz, &ptr) && sz >= szl) {
memcpy(ptr, VSB_data(synth_body), szl);
ObjExtend(wrk, req->objcore, szl);
ObjExtend(wrk, req->objcore, szl, 1);
} else if (sz > 0) {
szl = -1;
}
......
......@@ -248,7 +248,7 @@ void Bereq_Rollback(struct busyobj *);
/* cache_fetch_proc.c */
void VFP_Init(void);
enum vfp_status VFP_GetStorage(struct vfp_ctx *, ssize_t *sz, uint8_t **ptr);
void VFP_Extend(const struct vfp_ctx *, ssize_t sz);
void VFP_Extend(const struct vfp_ctx *, ssize_t sz, enum vfp_status);
void VFP_Setup(struct vfp_ctx *vc, struct worker *wrk);
int VFP_Open(struct vfp_ctx *bo);
uint64_t VFP_Close(struct vfp_ctx *bo);
......@@ -295,13 +295,12 @@ void ObjInit(void);
struct objcore * ObjNew(const struct worker *);
void ObjDestroy(const struct worker *, struct objcore **);
int ObjGetSpace(struct worker *, struct objcore *, ssize_t *sz, uint8_t **ptr);
void ObjExtend(struct worker *, struct objcore *, ssize_t l);
void ObjExtend(struct worker *, struct objcore *, ssize_t l, int final);
uint64_t ObjWaitExtend(const struct worker *, const struct objcore *,
uint64_t l);
void ObjSetState(struct worker *, const struct objcore *,
enum boc_state_e next);
void ObjWaitState(const struct objcore *, enum boc_state_e want);
void ObjTrimStore(struct worker *, struct objcore *);
void ObjTouch(struct worker *, struct objcore *, vtim_real now);
void ObjFreeObj(struct worker *, struct objcore *);
void ObjSlim(struct worker *, struct objcore *);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment