[GH-ISSUE #936] Bug - Object Update does not work since update to version 1.40 #146

Open
opened 2026-03-03 12:08:42 +03:00 by kerem · 1 comment
Owner

Originally created by @bzon on GitHub (Sep 29, 2022).
Original GitHub issue: https://github.com/fsouza/fake-gcs-server/issues/936

Error:

storage: object doesn't exist

The example code works fine if I'm using the docker image version 1.39.0

Server Installation:

version: '3.3'

services:
  fake-gcs-server:
    image: fsouza/fake-gcs-server:1.40 # buggy version, use 1.39.0!
    ports:
      - "4443:4443"
    expose:
      - "4443"

Sample Code:

package main

import (
	"context"
	"crypto/tls"
	"fmt"
	"io"
	"log"
	"net/http"
	"os"

	"cloud.google.com/go/storage"
	"google.golang.org/api/iterator"
	"google.golang.org/api/option"
)

func main() {
	transCfg := &http.Transport{
		TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
	}
	httpClient := &http.Client{Transport: transCfg}
	client, err := storage.NewClient(context.TODO(), option.WithEndpoint("https://localhost:4443/storage/v1/"), option.WithHTTPClient(httpClient))
	if err != nil {
		log.Fatalf("failed to create client: %v", err)
	}
	const (
		bucketName = "sample-bucket"
		fileKey    = "some_file.txt"
	)

	ctx := context.Background()
	bucket := client.Bucket(bucketName)

	// if err := bucket.Create(ctx, "project", nil); err != nil {
	// 	log.Println("create bucket failed:", err)
	// }

	os.Create(fileKey)

	f, err := os.Open(fileKey)
	if err != nil {
		log.Fatalf("failed to open/create file: %v", err)
	}

	object := bucket.Object(fileKey)
	wc := object.NewWriter(ctx)

	if _, err := io.Copy(wc, f); err != nil {
		log.Fatalf("failed to upload: %v", err)
	}

	if err := wc.Close(); err != nil {
		log.Fatalf("failed to upload: %v", err)
	}

	buckets, err := list(client, bucketName)
	if err != nil {
		log.Fatalf("failed to list: %v", err)
	}

	fmt.Printf("buckets: %+v\n", buckets)

	// try update object
	if _, err := object.Update(ctx, storage.ObjectAttrsToUpdate{Metadata: map[string]string{"k": "v"}}); err != nil {
		log.Fatalf("failed to update: %v", err)
	}
}

func list(client *storage.Client, bucketName string) ([]string, error) {
	var objects []string
	it := client.Bucket(bucketName).Objects(context.Background(), &storage.Query{})
	for {
		oattrs, err := it.Next()
		if err == iterator.Done {
			break
		}
		if err != nil {
			return nil, err
		}
		objects = append(objects, oattrs.Name)
	}
	return objects, nil
}

Output:

buckets: [some_file.txt]
2022/09/29 20:30:46 failed to update: storage: object doesn't exist
exit status 1
Originally created by @bzon on GitHub (Sep 29, 2022). Original GitHub issue: https://github.com/fsouza/fake-gcs-server/issues/936 Error: ``` storage: object doesn't exist ``` The example code works fine if I'm using the docker image version `1.39.0` Server Installation: ```yaml version: '3.3' services: fake-gcs-server: image: fsouza/fake-gcs-server:1.40 # buggy version, use 1.39.0! ports: - "4443:4443" expose: - "4443" ``` Sample Code: ```go package main import ( "context" "crypto/tls" "fmt" "io" "log" "net/http" "os" "cloud.google.com/go/storage" "google.golang.org/api/iterator" "google.golang.org/api/option" ) func main() { transCfg := &http.Transport{ TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, } httpClient := &http.Client{Transport: transCfg} client, err := storage.NewClient(context.TODO(), option.WithEndpoint("https://localhost:4443/storage/v1/"), option.WithHTTPClient(httpClient)) if err != nil { log.Fatalf("failed to create client: %v", err) } const ( bucketName = "sample-bucket" fileKey = "some_file.txt" ) ctx := context.Background() bucket := client.Bucket(bucketName) // if err := bucket.Create(ctx, "project", nil); err != nil { // log.Println("create bucket failed:", err) // } os.Create(fileKey) f, err := os.Open(fileKey) if err != nil { log.Fatalf("failed to open/create file: %v", err) } object := bucket.Object(fileKey) wc := object.NewWriter(ctx) if _, err := io.Copy(wc, f); err != nil { log.Fatalf("failed to upload: %v", err) } if err := wc.Close(); err != nil { log.Fatalf("failed to upload: %v", err) } buckets, err := list(client, bucketName) if err != nil { log.Fatalf("failed to list: %v", err) } fmt.Printf("buckets: %+v\n", buckets) // try update object if _, err := object.Update(ctx, storage.ObjectAttrsToUpdate{Metadata: map[string]string{"k": "v"}}); err != nil { log.Fatalf("failed to update: %v", err) } } func list(client *storage.Client, bucketName string) ([]string, error) { var objects []string it := client.Bucket(bucketName).Objects(context.Background(), &storage.Query{}) for { oattrs, err := it.Next() if err == iterator.Done { break } if err != nil { return nil, err } objects = append(objects, oattrs.Name) } return objects, nil } ``` Output: ``` buckets: [some_file.txt] 2022/09/29 20:30:46 failed to update: storage: object doesn't exist exit status 1 ```
Author
Owner

@jguerreiro-sqsp commented on GitHub (Nov 7, 2022):

The bug is also present in Object Delete operations.

From my experience, the bug was introduced during the transition from 1.40.1 to 1.40.2.

<!-- gh-comment-id:1306131802 --> @jguerreiro-sqsp commented on GitHub (Nov 7, 2022): The bug is also present in Object Delete operations. From my experience, the bug was introduced during the transition from `1.40.1` to `1.40.2`.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
starred/fake-gcs-server#146
No description provided.