[sheepdog] [PATCH v2 5/6] sheep/http: add FORCE_DELETE to delete 'incompleted' object

Liu Yuan namei.unix at gmail.com
Tue Feb 25 07:22:15 CET 2014


On Tue, Feb 25, 2014 at 02:07:23PM +0800, Robin Dong wrote:
> From: Robin Dong <sanbai at taobao.com>
> 
> Since sheep will only return 'CONFLICT' for a DELETE request to 'incompleted' object,
> we need a 'FORCE_DELETE' to really remove the 'incompleted' object and free its
> allocated space.
> 
> Signed-off-by: Robin Dong <sanbai at taobao.com>
> ---
>  sheep/http/http.c  |  5 +++++
>  sheep/http/http.h  |  5 ++++-
>  sheep/http/kv.c    |  5 +++--
>  sheep/http/s3.c    |  2 +-
>  sheep/http/swift.c | 44 +++++++++++++++++++++++++++++++++++++++++++-
>  5 files changed, 56 insertions(+), 5 deletions(-)
> 
> diff --git a/sheep/http/http.c b/sheep/http/http.c
> index 6a04252..e742a85 100644
> --- a/sheep/http/http.c
> +++ b/sheep/http/http.c
> @@ -30,6 +30,7 @@ static inline const char *stropcode(enum http_opcode opcode)
>  		[HTTP_PUT] = "PUT",
>  		[HTTP_POST] = "POST",
>  		[HTTP_DELETE] = "DELETE",
> +		[HTTP_FORCE_DELETE] = "FORCE_DELETE",
>  		[HTTP_HEAD] = "HEAD",
>  	};
>  
> @@ -152,6 +153,8 @@ static int request_init_operation(struct http_request *req)
>  		req->opcode = HTTP_POST;
>  	} else if (!strcmp(p, "DELETE")) {
>  		req->opcode = HTTP_DELETE;
> +	} else if (!strcmp(p, "FORCE_DELETE")) {
> +		req->opcode = HTTP_FORCE_DELETE;
>  	} else if (!strcmp(p, "HEAD")) {
>  		req->opcode = HTTP_HEAD;
>  	} else {
> @@ -263,6 +266,8 @@ static void http_run_request(struct work *work)
>  		case HTTP_DELETE:
>  			method = hdrv->delete;
>  			break;
> +		case HTTP_FORCE_DELETE:
> +			method = hdrv->force_delete;
>  		default:
>  			break;
>  		}
> diff --git a/sheep/http/http.h b/sheep/http/http.h
> index 5bcd528..87833e9 100644
> --- a/sheep/http/http.h
> +++ b/sheep/http/http.h
> @@ -21,6 +21,7 @@ enum http_opcode {
>  	HTTP_PUT,
>  	HTTP_POST,
>  	HTTP_DELETE,
> +	HTTP_FORCE_DELETE,
>  	HTTP_HEAD,
>  };
>  
> @@ -62,6 +63,7 @@ struct http_driver {
>  	void (*put)(struct http_request *req);
>  	void (*post)(struct http_request *req);
>  	void (*delete)(struct http_request *req);
> +	void (*force_delete)(struct http_request *req);
>  
>  	struct list_node list;
>  };
> @@ -146,7 +148,8 @@ int kv_read_object(struct http_request *req, const char *account,
>  		   const char *bucket, const char *object);
>  int kv_read_object_meta(struct http_request *req, const char *account,
>  			const char *bucket, const char *object);
> -int kv_delete_object(const char *account, const char *bucket, const char *);
> +int kv_delete_object(const char *account, const char *bucket, const char *,
> +		     bool force);
>  int kv_iterate_object(const char *account, const char *bucket,
>  		      void (*cb)(const char *object, void *opaque),
>  		      void *opaque);
> diff --git a/sheep/http/kv.c b/sheep/http/kv.c
> index 4e1f0c6..da73338 100644
> --- a/sheep/http/kv.c
> +++ b/sheep/http/kv.c
> @@ -1200,7 +1200,8 @@ out:
>  	return ret;
>  }
>  
> -int kv_delete_object(const char *account, const char *bucket, const char *name)
> +int kv_delete_object(const char *account, const char *bucket, const char *name,
> +		     bool force)
>  {
>  	char vdi_name[SD_MAX_VDI_LEN];
>  	uint32_t bucket_vid;
> @@ -1218,7 +1219,7 @@ int kv_delete_object(const char *account, const char *bucket, const char *name)
>  		goto out;
>  
>  	/* this object has not been uploaded complete */
> -	if (onode->flags != ONODE_COMPLETE) {
> +	if (!force && onode->flags != ONODE_COMPLETE) {
>  		ret = SD_RES_INCOMPLETE;
>  		goto out;
>  	}
> diff --git a/sheep/http/s3.c b/sheep/http/s3.c
> index aab1d1c..bf7b311 100644
> --- a/sheep/http/s3.c
> +++ b/sheep/http/s3.c
> @@ -137,7 +137,7 @@ static void s3_post_object(struct http_request *req, const char *bucket,
>  static void s3_delete_object(struct http_request *req, const char *bucket,
>  			     const char *object)
>  {
> -	kv_delete_object("s3", bucket, object);
> +	kv_delete_object("s3", bucket, object, 0);
>  
>  	if (req->status == NOT_FOUND)
>  		s3_write_err_response(req, "NoSuchKey",
> diff --git a/sheep/http/swift.c b/sheep/http/swift.c
> index aff0f09..8071299 100644
> --- a/sheep/http/swift.c
> +++ b/sheep/http/swift.c
> @@ -94,6 +94,12 @@ static void swift_delete_account(struct http_request *req, const char *account)
>  	}
>  }
>  
> +static void swift_force_delete_account(struct http_request *req,
> +				       const char *account)
> +{
> +	http_response_header(req, NOT_IMPLEMENTED);
> +}
> +
>  /* Operations on Containers */
>  
>  static void swift_head_container(struct http_request *req, const char *account,
> @@ -194,6 +200,13 @@ static void swift_delete_container(struct http_request *req,
>  	}
>  }
>  
> +static void swift_force_delete_container(struct http_request *req,
> +					 const char *account,
> +					 const char *container)
> +{
> +	http_response_header(req, NOT_IMPLEMENTED);
> +}
> +
>  /* Operations on Objects */
>  
>  static void swift_head_object(struct http_request *req, const char *account,
> @@ -280,7 +293,7 @@ static void swift_delete_object(struct http_request *req, const char *account,
>  {
>  	int ret;
>  
> -	ret = kv_delete_object(account, container, object);
> +	ret = kv_delete_object(account, container, object, 0);
>  	switch (ret) {
>  	case SD_RES_SUCCESS:
>  		http_response_header(req, NO_CONTENT);
> @@ -298,6 +311,27 @@ static void swift_delete_object(struct http_request *req, const char *account,
>  	}
>  }
>  
> +static void swift_force_delete_object(struct http_request *req,
> +				      const char *account,
> +				      const char *container, const char *object)
> +{
> +	int ret;
> +
> +	ret = kv_delete_object(account, container, object, 1);
> +	switch (ret) {
> +	case SD_RES_SUCCESS:
> +		http_response_header(req, NO_CONTENT);
> +		break;
> +	case SD_RES_NO_VDI:
> +	case SD_RES_NO_OBJ:
> +		http_response_header(req, NOT_FOUND);
> +		break;
> +	default:
> +		http_response_header(req, INTERNAL_SERVER_ERROR);
> +		break;
> +	}
> +}
> +
>  /* Swift driver interfaces */
>  
>  static int swift_init(const char *option)
> @@ -381,6 +415,13 @@ static void swift_delete(struct http_request *req)
>  			     swift_delete_object);
>  }
>  
> +static void swift_force_delete(struct http_request *req)
> +{
> +	swift_handle_request(req, swift_force_delete_account,
> +			     swift_force_delete_container,
> +			     swift_force_delete_object);
> +}
> +
>  static struct http_driver hdrv_swift = {
>  	.name	= "swift",
>  
> @@ -390,6 +431,7 @@ static struct http_driver hdrv_swift = {
>  	.put	= swift_put,
>  	.post	= swift_post,
>  	.delete	= swift_delete,
> +	.force_delete = swift_force_delete,

Don't add a new opertion. I'd suggest add a new header for delete operation that
indicate whether it is force delete.

Thanks
Yuan



More information about the sheepdog mailing list