[sheepdog] [PATCH] sheep: cache sha1 digest for read-only objects

MORITA Kazutaka morita.kazutaka at lab.ntt.co.jp
Tue May 14 09:43:39 CEST 2013


At Tue, 14 May 2013 15:25:10 +0800,
Liu Yuan wrote:
> 
> > +
> > +static int set_sha1_cache(uint64_t oid, uint32_t epoch, const uint8_t *sha1)
> > +{
> > +	char path[PATH_MAX];
> > +
> > +	if (!oid_is_readonly(oid))
> > +		return -1;
> > +
> 
> Stale object isn't marked readonly yet. So your patch won't be useful
> for recovery?

Useful for recovery of snapshot objects only.

> 
> > +	if (default_exist(oid))
> > +		get_obj_path(oid, path);
> > +	else
> > +		get_stale_obj_path(oid, epoch, path);
> > +
> > +	return setxattr(path, SHA1NAME, sha1, SHA1_LEN, 0);
> 
> setxattr can fail, need failure handling.

Okay, but I think we cannot handle the error but only print the error
message.  We can safely ignore the error because sheep can still work
even if we cannot save the cache.

> 
> > +}
> > +
> >  int default_get_hash(uint64_t oid, uint32_t epoch, uint8_t *sha1)
> >  {
> >  	int ret;
> > @@ -485,6 +527,11 @@ int default_get_hash(uint64_t oid, uint32_t epoch, uint8_t *sha1)
> >  	uint64_t offset = 0;
> >  	uint32_t length;
> >  
> > +	if (get_sha1_cache(oid, epoch, sha1) == 0) {
> > +		sd_dprintf("use cached sha1 digest %s", sha1_to_hex(sha1));
> > +		return SD_RES_SUCCESS;
> > +	}
> > +
> >  	length = get_objsize(oid);
> >  	buf = malloc(length);
> >  	if (buf == NULL)
> > @@ -512,6 +559,8 @@ int default_get_hash(uint64_t oid, uint32_t epoch, uint8_t *sha1)
> >  	sd_dprintf("the message digest of %"PRIx64" at epoch %d is %s", oid,
> >  		   epoch, sha1_to_hex(sha1));
> >  
> > +	set_sha1_cache(oid, epoch, sha1);
> 
> Better name as get/set_object_sha1() and put oid_is_readonly() check in
> the default_get_hash() will make the code better readability.

Agreed.

Thanks,

Kazutaka



More information about the sheepdog mailing list