Bläddra i källkod

no blob create if already exists

Michael Yang 1 år sedan
förälder
incheckning
e1c9a2a00f
2 ändrade filer med 19 tillägg och 13 borttagningar
  1. 1 13
      api/client.go
  2. 18 0
      server/routes.go

+ 1 - 13
api/client.go

@@ -5,7 +5,6 @@ import (
 	"bytes"
 	"bytes"
 	"context"
 	"context"
 	"encoding/json"
 	"encoding/json"
-	"errors"
 	"fmt"
 	"fmt"
 	"io"
 	"io"
 	"net"
 	"net"
@@ -301,18 +300,7 @@ func (c *Client) Embeddings(ctx context.Context, req *EmbeddingRequest) (*Embedd
 }
 }
 
 
 func (c *Client) CreateBlob(ctx context.Context, digest string, r io.Reader) error {
 func (c *Client) CreateBlob(ctx context.Context, digest string, r io.Reader) error {
-	if err := c.do(ctx, http.MethodHead, fmt.Sprintf("/api/blobs/%s", digest), nil, nil); err != nil {
-		var statusError StatusError
-		if !errors.As(err, &statusError) || statusError.StatusCode != http.StatusNotFound {
-			return err
-		}
-
-		if err := c.do(ctx, http.MethodPost, fmt.Sprintf("/api/blobs/%s", digest), r, nil); err != nil {
-			return err
-		}
-	}
-
-	return nil
+	return c.do(ctx, http.MethodPost, fmt.Sprintf("/api/blobs/%s", digest), r, nil)
 }
 }
 
 
 func (c *Client) Version(ctx context.Context) (string, error) {
 func (c *Client) Version(ctx context.Context) (string, error) {

+ 18 - 0
server/routes.go

@@ -913,6 +913,24 @@ func HeadBlobHandler(c *gin.Context) {
 }
 }
 
 
 func CreateBlobHandler(c *gin.Context) {
 func CreateBlobHandler(c *gin.Context) {
+	path, err := GetBlobsPath(c.Param("digest"))
+	if err != nil {
+		c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": err.Error()})
+		return
+	}
+
+	_, err = os.Stat(path)
+	switch {
+	case errors.Is(err, os.ErrNotExist):
+		// noop
+	case err != nil:
+		c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
+		return
+	default:
+		c.Status(http.StatusOK)
+		return
+	}
+
 	layer, err := NewLayer(c.Request.Body, "")
 	layer, err := NewLayer(c.Request.Body, "")
 	if err != nil {
 	if err != nil {
 		c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
 		c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"error": err.Error()})