chore: execute goimports to format the code (#7983)
* chore: execute goimports to format the code Signed-off-by: promalert <promalert@outlook.com> * goimports -w . --------- Signed-off-by: promalert <promalert@outlook.com> Co-authored-by: Chris Lu <chris.lu@gmail.com>
This commit is contained in:
@@ -3,13 +3,14 @@ package main
|
|||||||
import (
|
import (
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/seaweedfs/seaweedfs/other/mq_client_example/example"
|
|
||||||
"github.com/seaweedfs/seaweedfs/weed/mq/client/agent_client"
|
|
||||||
"github.com/seaweedfs/seaweedfs/weed/mq/schema"
|
|
||||||
"log"
|
"log"
|
||||||
"sync"
|
"sync"
|
||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/seaweedfs/seaweedfs/other/mq_client_example/example"
|
||||||
|
"github.com/seaweedfs/seaweedfs/weed/mq/client/agent_client"
|
||||||
|
"github.com/seaweedfs/seaweedfs/weed/mq/schema"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
|||||||
@@ -3,13 +3,14 @@ package main
|
|||||||
import (
|
import (
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"log"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/seaweedfs/seaweedfs/other/mq_client_example/example"
|
"github.com/seaweedfs/seaweedfs/other/mq_client_example/example"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/mq/client/agent_client"
|
"github.com/seaweedfs/seaweedfs/weed/mq/client/agent_client"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/mq/topic"
|
"github.com/seaweedfs/seaweedfs/weed/mq/topic"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/pb/schema_pb"
|
"github.com/seaweedfs/seaweedfs/weed/pb/schema_pb"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/util"
|
"github.com/seaweedfs/seaweedfs/weed/util"
|
||||||
"log"
|
|
||||||
"time"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
|||||||
@@ -419,7 +419,7 @@ func (c *Client) Read(ctx context.Context, req *ReadRequest) (*ReadResponse, err
|
|||||||
}).Info("✅ RDMA read completed successfully")
|
}).Info("✅ RDMA read completed successfully")
|
||||||
|
|
||||||
// MOCK DATA IMPLEMENTATION - FOR DEVELOPMENT/TESTING ONLY
|
// MOCK DATA IMPLEMENTATION - FOR DEVELOPMENT/TESTING ONLY
|
||||||
//
|
//
|
||||||
// This section generates placeholder data for the mock RDMA implementation.
|
// This section generates placeholder data for the mock RDMA implementation.
|
||||||
// In a production RDMA implementation, this should be replaced with:
|
// In a production RDMA implementation, this should be replaced with:
|
||||||
//
|
//
|
||||||
@@ -472,7 +472,7 @@ func (c *Client) ReadFileRange(ctx context.Context, fileID string, offset, size
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("invalid file ID %s: %w", fileID, err)
|
return nil, fmt.Errorf("invalid file ID %s: %w", fileID, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
req := &ReadRequest{
|
req := &ReadRequest{
|
||||||
VolumeID: volumeID,
|
VolumeID: volumeID,
|
||||||
NeedleID: needleID,
|
NeedleID: needleID,
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"seaweedfs-rdma-sidecar/pkg/rdma"
|
"seaweedfs-rdma-sidecar/pkg/rdma"
|
||||||
|
|||||||
@@ -7,10 +7,11 @@
|
|||||||
package proto
|
package proto
|
||||||
|
|
||||||
import (
|
import (
|
||||||
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
|
||||||
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
|
|
||||||
reflect "reflect"
|
reflect "reflect"
|
||||||
sync "sync"
|
sync "sync"
|
||||||
|
|
||||||
|
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
||||||
|
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package fuse_test
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/fs"
|
"io/fs"
|
||||||
|
"net"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
|||||||
@@ -3,5 +3,5 @@ package fuse_test
|
|||||||
import "testing"
|
import "testing"
|
||||||
|
|
||||||
func TestMinimal(t *testing.T) {
|
func TestMinimal(t *testing.T) {
|
||||||
t.Log("minimal test")
|
t.Log("minimal test")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -152,7 +152,7 @@ func testTwoConsumersRebalance(t *testing.T, addr, topicName, groupID string) {
|
|||||||
|
|
||||||
// Wait for rebalancing to occur - both consumers should get new assignments
|
// Wait for rebalancing to occur - both consumers should get new assignments
|
||||||
var rebalancedAssignment1, rebalancedAssignment2 []int32
|
var rebalancedAssignment1, rebalancedAssignment2 []int32
|
||||||
|
|
||||||
// Consumer1 should get a rebalance assignment
|
// Consumer1 should get a rebalance assignment
|
||||||
select {
|
select {
|
||||||
case partitions := <-handler1.assignments:
|
case partitions := <-handler1.assignments:
|
||||||
@@ -372,7 +372,7 @@ func testMultipleConsumersJoin(t *testing.T, addr, topicName, groupID string) {
|
|||||||
t.Errorf("Partition %d assigned to multiple consumers", partition)
|
t.Errorf("Partition %d assigned to multiple consumers", partition)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Each consumer should get exactly 1 partition (4 partitions / 4 consumers)
|
// Each consumer should get exactly 1 partition (4 partitions / 4 consumers)
|
||||||
if len(assignment) != 1 {
|
if len(assignment) != 1 {
|
||||||
t.Errorf("Consumer%d should get exactly 1 partition, got %d", i, len(assignment))
|
t.Errorf("Consumer%d should get exactly 1 partition, got %d", i, len(assignment))
|
||||||
@@ -408,7 +408,7 @@ func (h *RebalanceTestHandler) Setup(session sarama.ConsumerGroupSession) error
|
|||||||
h.readyOnce.Do(func() {
|
h.readyOnce.Do(func() {
|
||||||
close(h.ready)
|
close(h.ready)
|
||||||
})
|
})
|
||||||
|
|
||||||
// Send partition assignment
|
// Send partition assignment
|
||||||
partitions := make([]int32, 0)
|
partitions := make([]int32, 0)
|
||||||
for topic, partitionList := range session.Claims() {
|
for topic, partitionList := range session.Claims() {
|
||||||
@@ -417,13 +417,13 @@ func (h *RebalanceTestHandler) Setup(session sarama.ConsumerGroupSession) error
|
|||||||
partitions = append(partitions, partition)
|
partitions = append(partitions, partition)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
select {
|
select {
|
||||||
case h.assignments <- partitions:
|
case h.assignments <- partitions:
|
||||||
default:
|
default:
|
||||||
// Channel might be full, that's ok
|
// Channel might be full, that's ok
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -86,7 +86,7 @@ func TestSchemaEndToEnd_AvroRoundTrip(t *testing.T) {
|
|||||||
// Verify all fields
|
// Verify all fields
|
||||||
assert.Equal(t, int32(12345), decodedMap["id"])
|
assert.Equal(t, int32(12345), decodedMap["id"])
|
||||||
assert.Equal(t, "Alice Johnson", decodedMap["name"])
|
assert.Equal(t, "Alice Johnson", decodedMap["name"])
|
||||||
|
|
||||||
// Verify union fields
|
// Verify union fields
|
||||||
emailUnion, ok := decodedMap["email"].(map[string]interface{})
|
emailUnion, ok := decodedMap["email"].(map[string]interface{})
|
||||||
require.True(t, ok, "Email should be a union")
|
require.True(t, ok, "Email should be a union")
|
||||||
@@ -126,7 +126,7 @@ func TestSchemaEndToEnd_ProtobufRoundTrip(t *testing.T) {
|
|||||||
require.Equal(t, uint32(2), envelope.SchemaID, "Schema ID should match")
|
require.Equal(t, uint32(2), envelope.SchemaID, "Schema ID should match")
|
||||||
// Note: ParseConfluentEnvelope defaults to FormatAvro; format detection requires schema registry
|
// Note: ParseConfluentEnvelope defaults to FormatAvro; format detection requires schema registry
|
||||||
require.Equal(t, schema.FormatAvro, envelope.Format, "Format defaults to Avro without schema registry lookup")
|
require.Equal(t, schema.FormatAvro, envelope.Format, "Format defaults to Avro without schema registry lookup")
|
||||||
|
|
||||||
// For Protobuf with indexes, we need to use the specialized parser
|
// For Protobuf with indexes, we need to use the specialized parser
|
||||||
protobufEnvelope, ok := schema.ParseConfluentProtobufEnvelopeWithIndexCount(confluentMsg, 1)
|
protobufEnvelope, ok := schema.ParseConfluentProtobufEnvelopeWithIndexCount(confluentMsg, 1)
|
||||||
require.True(t, ok, "Message should be a valid Protobuf envelope")
|
require.True(t, ok, "Message should be a valid Protobuf envelope")
|
||||||
@@ -269,7 +269,6 @@ func createMockSchemaRegistryForE2E(t *testing.T) *httptest.Server {
|
|||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
func getUserAvroSchemaForE2E() string {
|
func getUserAvroSchemaForE2E() string {
|
||||||
return `{
|
return `{
|
||||||
"type": "record",
|
"type": "record",
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// TestConsumerStallingPattern is a REPRODUCER for the consumer stalling bug.
|
// TestConsumerStallingPattern is a REPRODUCER for the consumer stalling bug.
|
||||||
//
|
//
|
||||||
// This test simulates the exact pattern that causes consumers to stall:
|
// This test simulates the exact pattern that causes consumers to stall:
|
||||||
// 1. Consumer reads messages in batches
|
// 1. Consumer reads messages in batches
|
||||||
// 2. Consumer commits offset after each batch
|
// 2. Consumer commits offset after each batch
|
||||||
@@ -24,7 +24,7 @@ import (
|
|||||||
// If the test PASSES, it means consumer successfully fetches all messages (bug fixed)
|
// If the test PASSES, it means consumer successfully fetches all messages (bug fixed)
|
||||||
func TestConsumerStallingPattern(t *testing.T) {
|
func TestConsumerStallingPattern(t *testing.T) {
|
||||||
t.Skip("REPRODUCER TEST: Requires running load test infrastructure. See comments for setup.")
|
t.Skip("REPRODUCER TEST: Requires running load test infrastructure. See comments for setup.")
|
||||||
|
|
||||||
// This test documents the exact stalling pattern:
|
// This test documents the exact stalling pattern:
|
||||||
// - Consumers consume messages 0-163, commit offset 163
|
// - Consumers consume messages 0-163, commit offset 163
|
||||||
// - Next iteration: fetch offset 164+
|
// - Next iteration: fetch offset 164+
|
||||||
@@ -36,7 +36,7 @@ func TestConsumerStallingPattern(t *testing.T) {
|
|||||||
// 2. Empty fetch doesn't mean "end of partition" (could be transient)
|
// 2. Empty fetch doesn't mean "end of partition" (could be transient)
|
||||||
// 3. Consumer retries on empty fetch instead of giving up
|
// 3. Consumer retries on empty fetch instead of giving up
|
||||||
// 4. Logging shows why fetch stopped
|
// 4. Logging shows why fetch stopped
|
||||||
|
|
||||||
t.Logf("=== CONSUMER STALLING REPRODUCER ===")
|
t.Logf("=== CONSUMER STALLING REPRODUCER ===")
|
||||||
t.Logf("")
|
t.Logf("")
|
||||||
t.Logf("Setup Steps:")
|
t.Logf("Setup Steps:")
|
||||||
@@ -72,27 +72,27 @@ func TestConsumerStallingPattern(t *testing.T) {
|
|||||||
// This is a UNIT reproducer that can run standalone
|
// This is a UNIT reproducer that can run standalone
|
||||||
func TestOffsetPlusOneCalculation(t *testing.T) {
|
func TestOffsetPlusOneCalculation(t *testing.T) {
|
||||||
testCases := []struct {
|
testCases := []struct {
|
||||||
name string
|
name string
|
||||||
committedOffset int64
|
committedOffset int64
|
||||||
expectedNextOffset int64
|
expectedNextOffset int64
|
||||||
}{
|
}{
|
||||||
{"Offset 0", 0, 1},
|
{"Offset 0", 0, 1},
|
||||||
{"Offset 99", 99, 100},
|
{"Offset 99", 99, 100},
|
||||||
{"Offset 163", 163, 164}, // The exact stalling point!
|
{"Offset 163", 163, 164}, // The exact stalling point!
|
||||||
{"Offset 999", 999, 1000},
|
{"Offset 999", 999, 1000},
|
||||||
{"Large offset", 10000, 10001},
|
{"Large offset", 10000, 10001},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, tc := range testCases {
|
for _, tc := range testCases {
|
||||||
t.Run(tc.name, func(t *testing.T) {
|
t.Run(tc.name, func(t *testing.T) {
|
||||||
// This is the critical calculation
|
// This is the critical calculation
|
||||||
nextOffset := tc.committedOffset + 1
|
nextOffset := tc.committedOffset + 1
|
||||||
|
|
||||||
if nextOffset != tc.expectedNextOffset {
|
if nextOffset != tc.expectedNextOffset {
|
||||||
t.Fatalf("OFFSET MATH BUG: committed=%d, next=%d (expected %d)",
|
t.Fatalf("OFFSET MATH BUG: committed=%d, next=%d (expected %d)",
|
||||||
tc.committedOffset, nextOffset, tc.expectedNextOffset)
|
tc.committedOffset, nextOffset, tc.expectedNextOffset)
|
||||||
}
|
}
|
||||||
|
|
||||||
t.Logf("✓ offset %d → next fetch at %d", tc.committedOffset, nextOffset)
|
t.Logf("✓ offset %d → next fetch at %d", tc.committedOffset, nextOffset)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -105,18 +105,18 @@ func TestEmptyFetchShouldNotStopConsumer(t *testing.T) {
|
|||||||
// Scenario: Consumer committed offset 163, then fetches 164+
|
// Scenario: Consumer committed offset 163, then fetches 164+
|
||||||
committedOffset := int64(163)
|
committedOffset := int64(163)
|
||||||
nextFetchOffset := committedOffset + 1
|
nextFetchOffset := committedOffset + 1
|
||||||
|
|
||||||
// First attempt: get empty (transient - data might not be available yet)
|
// First attempt: get empty (transient - data might not be available yet)
|
||||||
// WRONG behavior (bug): Consumer sees 0 bytes and stops
|
// WRONG behavior (bug): Consumer sees 0 bytes and stops
|
||||||
// wrongConsumerLogic := (firstFetchResult == 0) // gives up!
|
// wrongConsumerLogic := (firstFetchResult == 0) // gives up!
|
||||||
|
|
||||||
// CORRECT behavior: Consumer should retry
|
// CORRECT behavior: Consumer should retry
|
||||||
correctConsumerLogic := true // continues retrying
|
correctConsumerLogic := true // continues retrying
|
||||||
|
|
||||||
if !correctConsumerLogic {
|
if !correctConsumerLogic {
|
||||||
t.Fatalf("Consumer incorrectly gave up after empty fetch at offset %d", nextFetchOffset)
|
t.Fatalf("Consumer incorrectly gave up after empty fetch at offset %d", nextFetchOffset)
|
||||||
}
|
}
|
||||||
|
|
||||||
t.Logf("✓ Empty fetch doesn't stop consumer, continues retrying")
|
t.Logf("✓ Empty fetch doesn't stop consumer, continues retrying")
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,11 +7,12 @@
|
|||||||
package pb
|
package pb
|
||||||
|
|
||||||
import (
|
import (
|
||||||
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
|
||||||
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
|
|
||||||
reflect "reflect"
|
reflect "reflect"
|
||||||
sync "sync"
|
sync "sync"
|
||||||
unsafe "unsafe"
|
unsafe "unsafe"
|
||||||
|
|
||||||
|
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
||||||
|
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|||||||
@@ -205,4 +205,3 @@ func TestResumeMillionRecords_Fixed(t *testing.T) {
|
|||||||
|
|
||||||
glog.Infof("🏆 MILLION RECORD KAFKA INTEGRATION TEST COMPLETED SUCCESSFULLY!")
|
glog.Infof("🏆 MILLION RECORD KAFKA INTEGRATION TEST COMPLETED SUCCESSFULLY!")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ func TestGatewayBasicFunctionality(t *testing.T) {
|
|||||||
defer gateway.CleanupAndClose()
|
defer gateway.CleanupAndClose()
|
||||||
|
|
||||||
addr := gateway.StartAndWait()
|
addr := gateway.StartAndWait()
|
||||||
|
|
||||||
// Give the gateway a bit more time to be fully ready
|
// Give the gateway a bit more time to be fully ready
|
||||||
time.Sleep(200 * time.Millisecond)
|
time.Sleep(200 * time.Millisecond)
|
||||||
|
|
||||||
@@ -32,17 +32,17 @@ func TestGatewayBasicFunctionality(t *testing.T) {
|
|||||||
func testGatewayAcceptsConnections(t *testing.T, addr string) {
|
func testGatewayAcceptsConnections(t *testing.T, addr string) {
|
||||||
// Test basic TCP connection to gateway
|
// Test basic TCP connection to gateway
|
||||||
t.Logf("Testing connection to gateway at %s", addr)
|
t.Logf("Testing connection to gateway at %s", addr)
|
||||||
|
|
||||||
conn, err := net.DialTimeout("tcp", addr, 5*time.Second)
|
conn, err := net.DialTimeout("tcp", addr, 5*time.Second)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("Failed to connect to gateway: %v", err)
|
t.Fatalf("Failed to connect to gateway: %v", err)
|
||||||
}
|
}
|
||||||
defer conn.Close()
|
defer conn.Close()
|
||||||
|
|
||||||
// Test that we can establish a connection and the gateway is listening
|
// Test that we can establish a connection and the gateway is listening
|
||||||
// We don't need to send a full Kafka request for this basic test
|
// We don't need to send a full Kafka request for this basic test
|
||||||
t.Logf("Successfully connected to gateway at %s", addr)
|
t.Logf("Successfully connected to gateway at %s", addr)
|
||||||
|
|
||||||
// Optional: Test that we can write some data without error
|
// Optional: Test that we can write some data without error
|
||||||
testData := []byte("test")
|
testData := []byte("test")
|
||||||
conn.SetWriteDeadline(time.Now().Add(1 * time.Second))
|
conn.SetWriteDeadline(time.Now().Add(1 * time.Second))
|
||||||
@@ -57,19 +57,19 @@ func testGatewayRefusesAfterClose(t *testing.T, gateway *testutil.GatewayTestSer
|
|||||||
// Get the address from the gateway's listener
|
// Get the address from the gateway's listener
|
||||||
host, port := gateway.GetListenerAddr()
|
host, port := gateway.GetListenerAddr()
|
||||||
addr := fmt.Sprintf("%s:%d", host, port)
|
addr := fmt.Sprintf("%s:%d", host, port)
|
||||||
|
|
||||||
// Close the gateway
|
// Close the gateway
|
||||||
gateway.CleanupAndClose()
|
gateway.CleanupAndClose()
|
||||||
|
|
||||||
t.Log("Testing that gateway refuses connections after close")
|
t.Log("Testing that gateway refuses connections after close")
|
||||||
|
|
||||||
// Attempt to connect - should fail
|
// Attempt to connect - should fail
|
||||||
conn, err := net.DialTimeout("tcp", addr, 2*time.Second)
|
conn, err := net.DialTimeout("tcp", addr, 2*time.Second)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
conn.Close()
|
conn.Close()
|
||||||
t.Fatal("Expected connection to fail after gateway close, but it succeeded")
|
t.Fatal("Expected connection to fail after gateway close, but it succeeded")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Verify it's a connection refused error
|
// Verify it's a connection refused error
|
||||||
if !strings.Contains(err.Error(), "connection refused") && !strings.Contains(err.Error(), "connect: connection refused") {
|
if !strings.Contains(err.Error(), "connection refused") && !strings.Contains(err.Error(), "connect: connection refused") {
|
||||||
t.Logf("Connection failed as expected with error: %v", err)
|
t.Logf("Connection failed as expected with error: %v", err)
|
||||||
|
|||||||
@@ -63,11 +63,11 @@ const (
|
|||||||
autoChunkSize = 8 * 1024 * 1024
|
autoChunkSize = 8 * 1024 * 1024
|
||||||
|
|
||||||
// Test sizes
|
// Test sizes
|
||||||
smallFileSize = 1 * 1024 // 1KB - single chunk
|
smallFileSize = 1 * 1024 // 1KB - single chunk
|
||||||
mediumFileSize = 256 * 1024 // 256KB - single chunk (at threshold)
|
mediumFileSize = 256 * 1024 // 256KB - single chunk (at threshold)
|
||||||
largeFileSize = 10 * 1024 * 1024 // 10MB - triggers auto-chunking (2 chunks)
|
largeFileSize = 10 * 1024 * 1024 // 10MB - triggers auto-chunking (2 chunks)
|
||||||
xlFileSize = 25 * 1024 * 1024 // 25MB - triggers auto-chunking (4 chunks)
|
xlFileSize = 25 * 1024 * 1024 // 25MB - triggers auto-chunking (4 chunks)
|
||||||
multipartSize = 5 * 1024 * 1024 // 5MB per part for multipart uploads
|
multipartSize = 5 * 1024 * 1024 // 5MB per part for multipart uploads
|
||||||
)
|
)
|
||||||
|
|
||||||
// ETag format patterns
|
// ETag format patterns
|
||||||
@@ -540,4 +540,3 @@ func TestMultipleLargeFileUploads(t *testing.T) {
|
|||||||
assert.NoError(t, err, "File %d ETag should be valid hex", i)
|
assert.NoError(t, err, "File %d ETag should be valid hex", i)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -443,7 +443,7 @@ func TestS3IAMBucketPolicyIntegration(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
assert.Equal(t, testObjectData, string(data))
|
assert.Equal(t, testObjectData, string(data))
|
||||||
result.Body.Close()
|
result.Body.Close()
|
||||||
|
|
||||||
// Clean up bucket policy after this test
|
// Clean up bucket policy after this test
|
||||||
_, err = adminClient.DeleteBucketPolicy(&s3.DeleteBucketPolicyInput{
|
_, err = adminClient.DeleteBucketPolicy(&s3.DeleteBucketPolicyInput{
|
||||||
Bucket: aws.String(bucketName),
|
Bucket: aws.String(bucketName),
|
||||||
@@ -481,7 +481,7 @@ func TestS3IAMBucketPolicyIntegration(t *testing.T) {
|
|||||||
assert.Contains(t, *policyResult.Policy, "Deny")
|
assert.Contains(t, *policyResult.Policy, "Deny")
|
||||||
|
|
||||||
// NOTE: Enforcement test is commented out due to known architectural limitation:
|
// NOTE: Enforcement test is commented out due to known architectural limitation:
|
||||||
//
|
//
|
||||||
// KNOWN LIMITATION: DeleteObject uses the coarse-grained ACTION_WRITE constant,
|
// KNOWN LIMITATION: DeleteObject uses the coarse-grained ACTION_WRITE constant,
|
||||||
// which convertActionToS3Format maps to "s3:PutObject" (not "s3:DeleteObject").
|
// which convertActionToS3Format maps to "s3:PutObject" (not "s3:DeleteObject").
|
||||||
// This means the policy engine evaluates the deny policy against "s3:PutObject",
|
// This means the policy engine evaluates the deny policy against "s3:PutObject",
|
||||||
@@ -499,7 +499,7 @@ func TestS3IAMBucketPolicyIntegration(t *testing.T) {
|
|||||||
// awsErr, ok := err.(awserr.Error)
|
// awsErr, ok := err.(awserr.Error)
|
||||||
// require.True(t, ok, "Error should be an awserr.Error")
|
// require.True(t, ok, "Error should be an awserr.Error")
|
||||||
// assert.Equal(t, "AccessDenied", awsErr.Code(), "Expected AccessDenied error code")
|
// assert.Equal(t, "AccessDenied", awsErr.Code(), "Expected AccessDenied error code")
|
||||||
|
|
||||||
// Clean up bucket policy after this test
|
// Clean up bucket policy after this test
|
||||||
_, err = adminClient.DeleteBucketPolicy(&s3.DeleteBucketPolicyInput{
|
_, err = adminClient.DeleteBucketPolicy(&s3.DeleteBucketPolicyInput{
|
||||||
Bucket: aws.String(bucketName),
|
Bucket: aws.String(bucketName),
|
||||||
|
|||||||
@@ -2,12 +2,13 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/aws/aws-sdk-go-v2/aws"
|
"github.com/aws/aws-sdk-go-v2/aws"
|
||||||
"github.com/aws/aws-sdk-go-v2/aws/retry"
|
"github.com/aws/aws-sdk-go-v2/aws/retry"
|
||||||
"github.com/aws/aws-sdk-go-v2/config"
|
"github.com/aws/aws-sdk-go-v2/config"
|
||||||
"github.com/aws/aws-sdk-go-v2/credentials"
|
"github.com/aws/aws-sdk-go-v2/credentials"
|
||||||
"github.com/aws/aws-sdk-go-v2/service/s3"
|
"github.com/aws/aws-sdk-go-v2/service/s3"
|
||||||
"time"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
|||||||
@@ -502,4 +502,3 @@ func TestGitHub7562LargeFile(t *testing.T) {
|
|||||||
|
|
||||||
t.Log("Large file test passed!")
|
t.Log("Large file test passed!")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -518,4 +518,3 @@ func TestMultipartUploadDeleteMarkerListBehavior(t *testing.T) {
|
|||||||
|
|
||||||
t.Logf("Object restored after delete marker removal, ETag=%s", multipartETag)
|
t.Logf("Object restored after delete marker removal, ETag=%s", multipartETag)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -319,4 +319,3 @@ func listAllVersions(t *testing.T, client *s3.Client, bucketName, objectKey stri
|
|||||||
t.Logf("Total: %d versions in %d pages", len(allVersions), pageCount)
|
t.Logf("Total: %d versions in %d pages", len(allVersions), pageCount)
|
||||||
return allVersions
|
return allVersions
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -540,11 +540,11 @@ func TestPathEdgeCases(t *testing.T) {
|
|||||||
// Therefore, we cannot trigger the server-side path traversal block with this client.
|
// Therefore, we cannot trigger the server-side path traversal block with this client.
|
||||||
// Instead, we verify that the file is created successfully within the jail (contained).
|
// Instead, we verify that the file is created successfully within the jail (contained).
|
||||||
// The server-side protection logic is verified in unit tests (sftpd/sftp_server_test.go).
|
// The server-side protection logic is verified in unit tests (sftpd/sftp_server_test.go).
|
||||||
|
|
||||||
file, err := sftpClient.Create(traversalPath)
|
file, err := sftpClient.Create(traversalPath)
|
||||||
require.NoError(t, err, "creation should succeed because client sanitizes path")
|
require.NoError(t, err, "creation should succeed because client sanitizes path")
|
||||||
file.Close()
|
file.Close()
|
||||||
|
|
||||||
// Clean up
|
// Clean up
|
||||||
err = sftpClient.Remove(traversalPath)
|
err = sftpClient.Remove(traversalPath)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
@@ -649,4 +649,3 @@ func TestFileContent(t *testing.T) {
|
|||||||
sftpClient.Remove(filename)
|
sftpClient.Remove(filename)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -420,4 +420,3 @@ func findTestDataPath() string {
|
|||||||
|
|
||||||
return "./testdata"
|
return "./testdata"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,10 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/seaweedfs/seaweedfs/weed/glog"
|
"github.com/seaweedfs/seaweedfs/weed/glog"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/pb"
|
"github.com/seaweedfs/seaweedfs/weed/pb"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/pb/filer_pb"
|
"github.com/seaweedfs/seaweedfs/weed/pb/filer_pb"
|
||||||
@@ -11,9 +15,6 @@ import (
|
|||||||
util_http "github.com/seaweedfs/seaweedfs/weed/util/http"
|
util_http "github.com/seaweedfs/seaweedfs/weed/util/http"
|
||||||
"google.golang.org/grpc"
|
"google.golang.org/grpc"
|
||||||
"google.golang.org/grpc/credentials/insecure"
|
"google.golang.org/grpc/credentials/insecure"
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
"time"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
|||||||
@@ -4,17 +4,16 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/pb"
|
|
||||||
"log"
|
"log"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"google.golang.org/grpc"
|
|
||||||
|
|
||||||
"github.com/seaweedfs/seaweedfs/weed/operation"
|
"github.com/seaweedfs/seaweedfs/weed/operation"
|
||||||
|
"github.com/seaweedfs/seaweedfs/weed/pb"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/security"
|
"github.com/seaweedfs/seaweedfs/weed/security"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/util"
|
"github.com/seaweedfs/seaweedfs/weed/util"
|
||||||
util_http "github.com/seaweedfs/seaweedfs/weed/util/http"
|
util_http "github.com/seaweedfs/seaweedfs/weed/util/http"
|
||||||
|
"google.golang.org/grpc"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
|||||||
@@ -4,13 +4,14 @@ import (
|
|||||||
"crypto/md5"
|
"crypto/md5"
|
||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/aws/aws-sdk-go/aws"
|
"github.com/aws/aws-sdk-go/aws"
|
||||||
"github.com/aws/aws-sdk-go/aws/session"
|
"github.com/aws/aws-sdk-go/aws/session"
|
||||||
"github.com/aws/aws-sdk-go/service/s3"
|
"github.com/aws/aws-sdk-go/service/s3"
|
||||||
util_http "github.com/seaweedfs/seaweedfs/weed/util/http"
|
util_http "github.com/seaweedfs/seaweedfs/weed/util/http"
|
||||||
"net/http"
|
|
||||||
"strings"
|
|
||||||
"time"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// Downloads an item from an S3 Bucket in the region configured in the shared config
|
// Downloads an item from an S3 Bucket in the region configured in the shared config
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ import (
|
|||||||
"bytes"
|
"bytes"
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
util_http "github.com/seaweedfs/seaweedfs/weed/util/http"
|
|
||||||
"io"
|
"io"
|
||||||
"log"
|
"log"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
@@ -14,6 +13,8 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
util_http "github.com/seaweedfs/seaweedfs/weed/util/http"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ import (
|
|||||||
"bytes"
|
"bytes"
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
util_http "github.com/seaweedfs/seaweedfs/weed/util/http"
|
|
||||||
"io"
|
"io"
|
||||||
"log"
|
"log"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
@@ -15,6 +14,8 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
util_http "github.com/seaweedfs/seaweedfs/weed/util/http"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
|||||||
@@ -3,11 +3,11 @@ package main
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"flag"
|
"flag"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/pb"
|
|
||||||
"log"
|
"log"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/seaweedfs/seaweedfs/weed/operation"
|
"github.com/seaweedfs/seaweedfs/weed/operation"
|
||||||
|
"github.com/seaweedfs/seaweedfs/weed/pb"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/security"
|
"github.com/seaweedfs/seaweedfs/weed/security"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/storage/needle"
|
"github.com/seaweedfs/seaweedfs/weed/storage/needle"
|
||||||
util2 "github.com/seaweedfs/seaweedfs/weed/util"
|
util2 "github.com/seaweedfs/seaweedfs/weed/util"
|
||||||
|
|||||||
@@ -1,10 +1,11 @@
|
|||||||
package cluster
|
package cluster
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/seaweedfs/seaweedfs/weed/pb"
|
|
||||||
"strconv"
|
"strconv"
|
||||||
"sync"
|
"sync"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/seaweedfs/seaweedfs/weed/pb"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestConcurrentAddRemoveNodes(t *testing.T) {
|
func TestConcurrentAddRemoveNodes(t *testing.T) {
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
package cluster
|
package cluster
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/seaweedfs/seaweedfs/weed/pb"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/seaweedfs/seaweedfs/weed/pb"
|
||||||
)
|
)
|
||||||
|
|
||||||
type GroupMembers struct {
|
type GroupMembers struct {
|
||||||
|
|||||||
@@ -2,9 +2,10 @@ package lock_manager
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/seaweedfs/seaweedfs/weed/glog"
|
"github.com/seaweedfs/seaweedfs/weed/glog"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/pb"
|
"github.com/seaweedfs/seaweedfs/weed/pb"
|
||||||
"time"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const RenewInterval = time.Second * 3
|
const RenewInterval = time.Second * 3
|
||||||
|
|||||||
@@ -2,10 +2,11 @@ package lock_manager
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/google/uuid"
|
|
||||||
"github.com/seaweedfs/seaweedfs/weed/glog"
|
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/google/uuid"
|
||||||
|
"github.com/seaweedfs/seaweedfs/weed/glog"
|
||||||
)
|
)
|
||||||
|
|
||||||
var LockErrorNonEmptyTokenOnNewLock = fmt.Errorf("lock: non-empty token on a new lock")
|
var LockErrorNonEmptyTokenOnNewLock = fmt.Errorf("lock: non-empty token on a new lock")
|
||||||
|
|||||||
@@ -2,12 +2,13 @@ package command
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/posener/complete"
|
|
||||||
completeinstall "github.com/posener/complete/cmd/install"
|
|
||||||
flag "github.com/seaweedfs/seaweedfs/weed/util/fla9"
|
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"runtime"
|
"runtime"
|
||||||
|
|
||||||
|
"github.com/posener/complete"
|
||||||
|
completeinstall "github.com/posener/complete/cmd/install"
|
||||||
|
flag "github.com/seaweedfs/seaweedfs/weed/util/fla9"
|
||||||
)
|
)
|
||||||
|
|
||||||
func AutocompleteMain(commands []*Command) bool {
|
func AutocompleteMain(commands []*Command) bool {
|
||||||
|
|||||||
@@ -4,8 +4,6 @@ import (
|
|||||||
"bufio"
|
"bufio"
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/pb"
|
|
||||||
"github.com/seaweedfs/seaweedfs/weed/util/version"
|
|
||||||
"io"
|
"io"
|
||||||
"math"
|
"math"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
@@ -16,14 +14,15 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"google.golang.org/grpc"
|
|
||||||
|
|
||||||
"github.com/seaweedfs/seaweedfs/weed/glog"
|
"github.com/seaweedfs/seaweedfs/weed/glog"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/operation"
|
"github.com/seaweedfs/seaweedfs/weed/operation"
|
||||||
|
"github.com/seaweedfs/seaweedfs/weed/pb"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/security"
|
"github.com/seaweedfs/seaweedfs/weed/security"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/util"
|
"github.com/seaweedfs/seaweedfs/weed/util"
|
||||||
util_http "github.com/seaweedfs/seaweedfs/weed/util/http"
|
util_http "github.com/seaweedfs/seaweedfs/weed/util/http"
|
||||||
|
"github.com/seaweedfs/seaweedfs/weed/util/version"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/wdclient"
|
"github.com/seaweedfs/seaweedfs/weed/wdclient"
|
||||||
|
"google.golang.org/grpc"
|
||||||
)
|
)
|
||||||
|
|
||||||
type BenchmarkOptions struct {
|
type BenchmarkOptions struct {
|
||||||
|
|||||||
@@ -2,13 +2,13 @@ package command
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/filer"
|
|
||||||
"github.com/seaweedfs/seaweedfs/weed/pb"
|
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/seaweedfs/seaweedfs/weed/filer"
|
||||||
|
"github.com/seaweedfs/seaweedfs/weed/pb"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/pb/filer_pb"
|
"github.com/seaweedfs/seaweedfs/weed/pb/filer_pb"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/security"
|
"github.com/seaweedfs/seaweedfs/weed/security"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/util"
|
"github.com/seaweedfs/seaweedfs/weed/util"
|
||||||
|
|||||||
@@ -5,11 +5,12 @@ package command
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"strings"
|
||||||
|
|
||||||
jsoniter "github.com/json-iterator/go"
|
jsoniter "github.com/json-iterator/go"
|
||||||
elastic "github.com/olivere/elastic/v7"
|
elastic "github.com/olivere/elastic/v7"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/pb/filer_pb"
|
"github.com/seaweedfs/seaweedfs/weed/pb/filer_pb"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/util"
|
"github.com/seaweedfs/seaweedfs/weed/util"
|
||||||
"strings"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type EsDocument struct {
|
type EsDocument struct {
|
||||||
|
|||||||
@@ -3,6 +3,9 @@ package command
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/seaweedfs/seaweedfs/weed/glog"
|
"github.com/seaweedfs/seaweedfs/weed/glog"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/pb"
|
"github.com/seaweedfs/seaweedfs/weed/pb"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/pb/filer_pb"
|
"github.com/seaweedfs/seaweedfs/weed/pb/filer_pb"
|
||||||
@@ -11,8 +14,6 @@ import (
|
|||||||
"github.com/seaweedfs/seaweedfs/weed/security"
|
"github.com/seaweedfs/seaweedfs/weed/security"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/util"
|
"github.com/seaweedfs/seaweedfs/weed/util"
|
||||||
"google.golang.org/grpc"
|
"google.golang.org/grpc"
|
||||||
"os"
|
|
||||||
"time"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type RemoteGatewayOptions struct {
|
type RemoteGatewayOptions struct {
|
||||||
|
|||||||
@@ -3,6 +3,12 @@ package command
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"math"
|
||||||
|
"math/rand"
|
||||||
|
"path/filepath"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/seaweedfs/seaweedfs/weed/filer"
|
"github.com/seaweedfs/seaweedfs/weed/filer"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/glog"
|
"github.com/seaweedfs/seaweedfs/weed/glog"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/pb"
|
"github.com/seaweedfs/seaweedfs/weed/pb"
|
||||||
@@ -12,11 +18,6 @@ import (
|
|||||||
"github.com/seaweedfs/seaweedfs/weed/replication/source"
|
"github.com/seaweedfs/seaweedfs/weed/replication/source"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/util"
|
"github.com/seaweedfs/seaweedfs/weed/util"
|
||||||
"google.golang.org/protobuf/proto"
|
"google.golang.org/protobuf/proto"
|
||||||
"math"
|
|
||||||
"math/rand"
|
|
||||||
"path/filepath"
|
|
||||||
"strings"
|
|
||||||
"time"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func (option *RemoteGatewayOptions) followBucketUpdatesAndUploadToRemote(filerSource *source.FilerSource) error {
|
func (option *RemoteGatewayOptions) followBucketUpdatesAndUploadToRemote(filerSource *source.FilerSource) error {
|
||||||
|
|||||||
@@ -2,6 +2,8 @@ package command
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/seaweedfs/seaweedfs/weed/glog"
|
"github.com/seaweedfs/seaweedfs/weed/glog"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/pb"
|
"github.com/seaweedfs/seaweedfs/weed/pb"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/pb/filer_pb"
|
"github.com/seaweedfs/seaweedfs/weed/pb/filer_pb"
|
||||||
@@ -9,7 +11,6 @@ import (
|
|||||||
"github.com/seaweedfs/seaweedfs/weed/security"
|
"github.com/seaweedfs/seaweedfs/weed/security"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/util"
|
"github.com/seaweedfs/seaweedfs/weed/util"
|
||||||
"google.golang.org/grpc"
|
"google.golang.org/grpc"
|
||||||
"time"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type RemoteSyncOptions struct {
|
type RemoteSyncOptions struct {
|
||||||
|
|||||||
@@ -1,12 +1,13 @@
|
|||||||
package command
|
package command
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"sync"
|
||||||
|
"sync/atomic"
|
||||||
|
|
||||||
"github.com/seaweedfs/seaweedfs/weed/glog"
|
"github.com/seaweedfs/seaweedfs/weed/glog"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/pb"
|
"github.com/seaweedfs/seaweedfs/weed/pb"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/pb/filer_pb"
|
"github.com/seaweedfs/seaweedfs/weed/pb/filer_pb"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/util"
|
"github.com/seaweedfs/seaweedfs/weed/util"
|
||||||
"sync"
|
|
||||||
"sync/atomic"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type MetadataProcessor struct {
|
type MetadataProcessor struct {
|
||||||
|
|||||||
@@ -1105,7 +1105,6 @@ func startMiniWorker() {
|
|||||||
glog.Infof("Maintenance worker %s started successfully", workerInstance.ID())
|
glog.Infof("Maintenance worker %s started successfully", workerInstance.ID())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const credentialsInstructionTemplate = `
|
const credentialsInstructionTemplate = `
|
||||||
To create S3 credentials, you have two options:
|
To create S3 credentials, you have two options:
|
||||||
|
|
||||||
@@ -1166,10 +1165,10 @@ func printWelcomeMessage() {
|
|||||||
fmt.Fprintf(&sb, credentialsInstructionTemplate, *miniIp, *miniAdminOptions.port)
|
fmt.Fprintf(&sb, credentialsInstructionTemplate, *miniIp, *miniAdminOptions.port)
|
||||||
} else {
|
} else {
|
||||||
sb.WriteString("\n To create S3 credentials, use environment variables:\n\n")
|
sb.WriteString("\n To create S3 credentials, use environment variables:\n\n")
|
||||||
sb.WriteString(" export AWS_ACCESS_KEY_ID=your-access-key\\n")
|
sb.WriteString(" export AWS_ACCESS_KEY_ID=your-access-key\\n")
|
||||||
sb.WriteString(" export AWS_SECRET_ACCESS_KEY=your-secret-key\\n")
|
sb.WriteString(" export AWS_SECRET_ACCESS_KEY=your-secret-key\\n")
|
||||||
sb.WriteString(" weed mini -dir=/data\\n")
|
sb.WriteString(" weed mini -dir=/data\\n")
|
||||||
sb.WriteString(" This will create initial credentials for the 'mini' user.\\n")
|
sb.WriteString(" This will create initial credentials for the 'mini' user.\\n")
|
||||||
}
|
}
|
||||||
|
|
||||||
fmt.Print(sb.String())
|
fmt.Print(sb.String())
|
||||||
|
|||||||
@@ -3,10 +3,11 @@ package command
|
|||||||
import (
|
import (
|
||||||
"bufio"
|
"bufio"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/glog"
|
|
||||||
"io"
|
"io"
|
||||||
"os"
|
"os"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"github.com/seaweedfs/seaweedfs/weed/glog"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ package command
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/util/version"
|
|
||||||
"net"
|
"net"
|
||||||
"os"
|
"os"
|
||||||
"runtime"
|
"runtime"
|
||||||
@@ -17,6 +16,7 @@ import (
|
|||||||
stats_collect "github.com/seaweedfs/seaweedfs/weed/stats"
|
stats_collect "github.com/seaweedfs/seaweedfs/weed/stats"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/util"
|
"github.com/seaweedfs/seaweedfs/weed/util"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/util/grace"
|
"github.com/seaweedfs/seaweedfs/weed/util/grace"
|
||||||
|
"github.com/seaweedfs/seaweedfs/weed/util/version"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package command
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/seaweedfs/seaweedfs/weed/pb"
|
"github.com/seaweedfs/seaweedfs/weed/pb"
|
||||||
|
|
||||||
"github.com/seaweedfs/seaweedfs/weed/security"
|
"github.com/seaweedfs/seaweedfs/weed/security"
|
||||||
|
|||||||
@@ -10,7 +10,6 @@ import (
|
|||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
swv "github.com/seaweedfs/seaweedfs/weed/util/version"
|
|
||||||
"io"
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
@@ -22,6 +21,7 @@ import (
|
|||||||
"github.com/seaweedfs/seaweedfs/weed/glog"
|
"github.com/seaweedfs/seaweedfs/weed/glog"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/util"
|
"github.com/seaweedfs/seaweedfs/weed/util"
|
||||||
util_http "github.com/seaweedfs/seaweedfs/weed/util/http"
|
util_http "github.com/seaweedfs/seaweedfs/weed/util/http"
|
||||||
|
swv "github.com/seaweedfs/seaweedfs/weed/util/version"
|
||||||
"golang.org/x/net/context/ctxhttp"
|
"golang.org/x/net/context/ctxhttp"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -2,8 +2,9 @@ package command
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/util/version"
|
|
||||||
"runtime"
|
"runtime"
|
||||||
|
|
||||||
|
"github.com/seaweedfs/seaweedfs/weed/util/version"
|
||||||
)
|
)
|
||||||
|
|
||||||
var cmdVersion = &Command{
|
var cmdVersion = &Command{
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ import (
|
|||||||
func (store *FilerEtcStore) LoadConfiguration(ctx context.Context) (*iam_pb.S3ApiConfiguration, error) {
|
func (store *FilerEtcStore) LoadConfiguration(ctx context.Context) (*iam_pb.S3ApiConfiguration, error) {
|
||||||
s3cfg := &iam_pb.S3ApiConfiguration{}
|
s3cfg := &iam_pb.S3ApiConfiguration{}
|
||||||
|
|
||||||
glog.V(1).Infof("Loading IAM configuration from %s/%s (using current active filer)",
|
glog.V(1).Infof("Loading IAM configuration from %s/%s (using current active filer)",
|
||||||
filer.IamConfigDirectory, filer.IamIdentityFile)
|
filer.IamConfigDirectory, filer.IamIdentityFile)
|
||||||
|
|
||||||
err := store.withFilerClient(func(client filer_pb.SeaweedFilerClient) error {
|
err := store.withFilerClient(func(client filer_pb.SeaweedFilerClient) error {
|
||||||
@@ -25,31 +25,31 @@ func (store *FilerEtcStore) LoadConfiguration(ctx context.Context) (*iam_pb.S3Ap
|
|||||||
content, err := filer.ReadInsideFiler(client, filer.IamConfigDirectory, filer.IamIdentityFile)
|
content, err := filer.ReadInsideFiler(client, filer.IamConfigDirectory, filer.IamIdentityFile)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if err == filer_pb.ErrNotFound {
|
if err == filer_pb.ErrNotFound {
|
||||||
glog.V(1).Infof("IAM identity file not found at %s/%s, no credentials loaded",
|
glog.V(1).Infof("IAM identity file not found at %s/%s, no credentials loaded",
|
||||||
filer.IamConfigDirectory, filer.IamIdentityFile)
|
filer.IamConfigDirectory, filer.IamIdentityFile)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
glog.Errorf("Failed to read IAM identity file from %s/%s: %v",
|
glog.Errorf("Failed to read IAM identity file from %s/%s: %v",
|
||||||
filer.IamConfigDirectory, filer.IamIdentityFile, err)
|
filer.IamConfigDirectory, filer.IamIdentityFile, err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(content) == 0 {
|
if len(content) == 0 {
|
||||||
glog.V(1).Infof("IAM identity file at %s/%s is empty",
|
glog.V(1).Infof("IAM identity file at %s/%s is empty",
|
||||||
filer.IamConfigDirectory, filer.IamIdentityFile)
|
filer.IamConfigDirectory, filer.IamIdentityFile)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
glog.V(2).Infof("Read %d bytes from %s/%s",
|
glog.V(2).Infof("Read %d bytes from %s/%s",
|
||||||
len(content), filer.IamConfigDirectory, filer.IamIdentityFile)
|
len(content), filer.IamConfigDirectory, filer.IamIdentityFile)
|
||||||
|
|
||||||
if err := filer.ParseS3ConfigurationFromBytes(content, s3cfg); err != nil {
|
if err := filer.ParseS3ConfigurationFromBytes(content, s3cfg); err != nil {
|
||||||
glog.Errorf("Failed to parse IAM configuration from %s/%s: %v",
|
glog.Errorf("Failed to parse IAM configuration from %s/%s: %v",
|
||||||
filer.IamConfigDirectory, filer.IamIdentityFile, err)
|
filer.IamConfigDirectory, filer.IamIdentityFile, err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
glog.V(1).Infof("Successfully parsed IAM configuration with %d identities and %d accounts",
|
glog.V(1).Infof("Successfully parsed IAM configuration with %d identities and %d accounts",
|
||||||
len(s3cfg.Identities), len(s3cfg.Accounts))
|
len(s3cfg.Identities), len(s3cfg.Accounts))
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
@@ -63,7 +63,7 @@ func (store *FilerEtcStore) LoadConfiguration(ctx context.Context) (*iam_pb.S3Ap
|
|||||||
for _, identity := range s3cfg.Identities {
|
for _, identity := range s3cfg.Identities {
|
||||||
credCount := len(identity.Credentials)
|
credCount := len(identity.Credentials)
|
||||||
actionCount := len(identity.Actions)
|
actionCount := len(identity.Actions)
|
||||||
glog.V(2).Infof(" Identity: %s (credentials: %d, actions: %d)",
|
glog.V(2).Infof(" Identity: %s (credentials: %d, actions: %d)",
|
||||||
identity.Name, credCount, actionCount)
|
identity.Name, credCount, actionCount)
|
||||||
for _, cred := range identity.Credentials {
|
for _, cred := range identity.Credentials {
|
||||||
glog.V(3).Infof(" Access Key: %s", cred.AccessKey)
|
glog.V(3).Infof(" Access Key: %s", cred.AccessKey)
|
||||||
|
|||||||
@@ -24,14 +24,14 @@ func (store *FilerEtcStore) GetPolicies(ctx context.Context) (map[string]policy_
|
|||||||
store.mu.RLock()
|
store.mu.RLock()
|
||||||
configured := store.filerAddressFunc != nil
|
configured := store.filerAddressFunc != nil
|
||||||
store.mu.RUnlock()
|
store.mu.RUnlock()
|
||||||
|
|
||||||
if !configured {
|
if !configured {
|
||||||
glog.V(1).Infof("Filer client not configured for policy retrieval, returning empty policies")
|
glog.V(1).Infof("Filer client not configured for policy retrieval, returning empty policies")
|
||||||
// Return empty policies if filer client is not configured
|
// Return empty policies if filer client is not configured
|
||||||
return policiesCollection.Policies, nil
|
return policiesCollection.Policies, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
glog.V(2).Infof("Loading IAM policies from %s/%s (using current active filer)",
|
glog.V(2).Infof("Loading IAM policies from %s/%s (using current active filer)",
|
||||||
filer.IamConfigDirectory, filer.IamPoliciesFile)
|
filer.IamConfigDirectory, filer.IamPoliciesFile)
|
||||||
|
|
||||||
err := store.withFilerClient(func(client filer_pb.SeaweedFilerClient) error {
|
err := store.withFilerClient(func(client filer_pb.SeaweedFilerClient) error {
|
||||||
@@ -41,27 +41,27 @@ func (store *FilerEtcStore) GetPolicies(ctx context.Context) (map[string]policy_
|
|||||||
content, err := filer.ReadInsideFiler(client, filer.IamConfigDirectory, filer.IamPoliciesFile)
|
content, err := filer.ReadInsideFiler(client, filer.IamConfigDirectory, filer.IamPoliciesFile)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if err == filer_pb.ErrNotFound {
|
if err == filer_pb.ErrNotFound {
|
||||||
glog.V(1).Infof("Policies file not found at %s/%s, returning empty policies",
|
glog.V(1).Infof("Policies file not found at %s/%s, returning empty policies",
|
||||||
filer.IamConfigDirectory, filer.IamPoliciesFile)
|
filer.IamConfigDirectory, filer.IamPoliciesFile)
|
||||||
// If file doesn't exist, return empty collection
|
// If file doesn't exist, return empty collection
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
glog.Errorf("Failed to read IAM policies file from %s/%s: %v",
|
glog.Errorf("Failed to read IAM policies file from %s/%s: %v",
|
||||||
filer.IamConfigDirectory, filer.IamPoliciesFile, err)
|
filer.IamConfigDirectory, filer.IamPoliciesFile, err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(content) == 0 {
|
if len(content) == 0 {
|
||||||
glog.V(2).Infof("IAM policies file at %s/%s is empty",
|
glog.V(2).Infof("IAM policies file at %s/%s is empty",
|
||||||
filer.IamConfigDirectory, filer.IamPoliciesFile)
|
filer.IamConfigDirectory, filer.IamPoliciesFile)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
glog.V(2).Infof("Read %d bytes from %s/%s",
|
glog.V(2).Infof("Read %d bytes from %s/%s",
|
||||||
len(content), filer.IamConfigDirectory, filer.IamPoliciesFile)
|
len(content), filer.IamConfigDirectory, filer.IamPoliciesFile)
|
||||||
|
|
||||||
if err := json.Unmarshal(content, policiesCollection); err != nil {
|
if err := json.Unmarshal(content, policiesCollection); err != nil {
|
||||||
glog.Errorf("Failed to parse IAM policies from %s/%s: %v",
|
glog.Errorf("Failed to parse IAM policies from %s/%s: %v",
|
||||||
filer.IamConfigDirectory, filer.IamPoliciesFile, err)
|
filer.IamConfigDirectory, filer.IamPoliciesFile, err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -64,7 +64,7 @@ func (store *FilerEtcStore) withFilerClient(fn func(client filer_pb.SeaweedFiler
|
|||||||
filerAddress := store.filerAddressFunc()
|
filerAddress := store.filerAddressFunc()
|
||||||
dialOption := store.grpcDialOption
|
dialOption := store.grpcDialOption
|
||||||
store.mu.RUnlock()
|
store.mu.RUnlock()
|
||||||
|
|
||||||
if filerAddress == "" {
|
if filerAddress == "" {
|
||||||
return fmt.Errorf("filer_etc: no filer discovered yet - please ensure a filer is running and accessible")
|
return fmt.Errorf("filer_etc: no filer discovered yet - please ensure a filer is running and accessible")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,10 +5,11 @@ import (
|
|||||||
"database/sql"
|
"database/sql"
|
||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"github.com/seaweedfs/seaweedfs/weed/filer"
|
"github.com/seaweedfs/seaweedfs/weed/filer"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/glog"
|
"github.com/seaweedfs/seaweedfs/weed/glog"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/util"
|
"github.com/seaweedfs/seaweedfs/weed/util"
|
||||||
"strings"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func (store *AbstractSqlStore) KvPut(ctx context.Context, key []byte, value []byte) (err error) {
|
func (store *AbstractSqlStore) KvPut(ctx context.Context, key []byte, value []byte) (err error) {
|
||||||
|
|||||||
@@ -2,11 +2,10 @@ package arangodb
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"github.com/arangodb/go-driver"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/arangodb/go-driver"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/filer"
|
"github.com/seaweedfs/seaweedfs/weed/filer"
|
||||||
|
|
||||||
"github.com/seaweedfs/seaweedfs/weed/glog"
|
"github.com/seaweedfs/seaweedfs/weed/glog"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/gocql/gocql"
|
"github.com/gocql/gocql"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/filer"
|
"github.com/seaweedfs/seaweedfs/weed/filer"
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/gocql/gocql"
|
"github.com/gocql/gocql"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/filer"
|
"github.com/seaweedfs/seaweedfs/weed/filer"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/util"
|
"github.com/seaweedfs/seaweedfs/weed/util"
|
||||||
|
|||||||
@@ -1,11 +1,12 @@
|
|||||||
package filer
|
package filer
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/seaweedfs/seaweedfs/weed/glog"
|
|
||||||
"github.com/seaweedfs/seaweedfs/weed/util"
|
|
||||||
"os"
|
"os"
|
||||||
"reflect"
|
"reflect"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"github.com/seaweedfs/seaweedfs/weed/glog"
|
||||||
|
"github.com/seaweedfs/seaweedfs/weed/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
|||||||
@@ -203,6 +203,3 @@ func (q *CleanupQueue) OldestAge() time.Duration {
|
|||||||
item := front.Value.(*queueItem)
|
item := front.Value.(*queueItem)
|
||||||
return time.Since(item.queueTime)
|
return time.Since(item.queueTime)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -367,6 +367,3 @@ func TestCleanupQueue_Concurrent(t *testing.T) {
|
|||||||
// Just verify no panic occurred and queue is in consistent state
|
// Just verify no panic occurred and queue is in consistent state
|
||||||
_ = q.Len()
|
_ = q.Len()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -433,4 +433,3 @@ func (efc *EmptyFolderCleaner) GetCachedFolderCount(folder string) (int, bool) {
|
|||||||
}
|
}
|
||||||
return 0, false
|
return 0, false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -566,4 +566,3 @@ func TestEmptyFolderCleaner_queueFIFOOrder(t *testing.T) {
|
|||||||
|
|
||||||
cleaner.Stop()
|
cleaner.Stop()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
package filer
|
package filer
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/seaweedfs/seaweedfs/weed/s3api/s3_constants"
|
|
||||||
"os"
|
"os"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/seaweedfs/seaweedfs/weed/pb/filer_pb"
|
"github.com/seaweedfs/seaweedfs/weed/pb/filer_pb"
|
||||||
|
"github.com/seaweedfs/seaweedfs/weed/s3api/s3_constants"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/util"
|
"github.com/seaweedfs/seaweedfs/weed/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package etcd
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/seaweedfs/seaweedfs/weed/filer"
|
"github.com/seaweedfs/seaweedfs/weed/filer"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
package etcd
|
package etcd
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/seaweedfs/seaweedfs/weed/filer/store_test"
|
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/seaweedfs/seaweedfs/weed/filer/store_test"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestStore(t *testing.T) {
|
func TestStore(t *testing.T) {
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
package filer
|
package filer
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/seaweedfs/seaweedfs/weed/pb/filer_pb"
|
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/seaweedfs/seaweedfs/weed/pb/filer_pb"
|
||||||
)
|
)
|
||||||
|
|
||||||
func Test_removeGarbageChunks(t *testing.T) {
|
func Test_removeGarbageChunks(t *testing.T) {
|
||||||
|
|||||||
@@ -4,11 +4,11 @@ import (
|
|||||||
"bytes"
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/wdclient"
|
|
||||||
"math"
|
"math"
|
||||||
|
|
||||||
"github.com/seaweedfs/seaweedfs/weed/pb/filer_pb"
|
"github.com/seaweedfs/seaweedfs/weed/pb/filer_pb"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/util"
|
"github.com/seaweedfs/seaweedfs/weed/util"
|
||||||
|
"github.com/seaweedfs/seaweedfs/weed/wdclient"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TotalSize(chunks []*filer_pb.FileChunk) (size uint64) {
|
func TotalSize(chunks []*filer_pb.FileChunk) (size uint64) {
|
||||||
|
|||||||
@@ -2,13 +2,13 @@ package filer
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"github.com/stretchr/testify/assert"
|
|
||||||
"log"
|
"log"
|
||||||
"slices"
|
"slices"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/seaweedfs/seaweedfs/weed/glog"
|
"github.com/seaweedfs/seaweedfs/weed/glog"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/pb/filer_pb"
|
"github.com/seaweedfs/seaweedfs/weed/pb/filer_pb"
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestDoMinusChunks(t *testing.T) {
|
func TestDoMinusChunks(t *testing.T) {
|
||||||
|
|||||||
@@ -2,8 +2,9 @@ package filer
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"container/list"
|
"container/list"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/pb/filer_pb"
|
|
||||||
"slices"
|
"slices"
|
||||||
|
|
||||||
|
"github.com/seaweedfs/seaweedfs/weed/pb/filer_pb"
|
||||||
)
|
)
|
||||||
|
|
||||||
func readResolvedChunks(chunks []*filer_pb.FileChunk, startOffset int64, stopOffset int64) (visibles *IntervalList[*VisibleInterval]) {
|
func readResolvedChunks(chunks []*filer_pb.FileChunk, startOffset int64, stopOffset int64) (visibles *IntervalList[*VisibleInterval]) {
|
||||||
|
|||||||
@@ -2,10 +2,11 @@ package filer
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/pb/filer_pb"
|
|
||||||
"math"
|
"math"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/seaweedfs/seaweedfs/weed/pb/filer_pb"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestReadResolvedChunks(t *testing.T) {
|
func TestReadResolvedChunks(t *testing.T) {
|
||||||
|
|||||||
@@ -32,9 +32,9 @@ type VirtualFilerStore interface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type FilerStoreWrapper struct {
|
type FilerStoreWrapper struct {
|
||||||
defaultStore FilerStore
|
defaultStore FilerStore
|
||||||
pathToStore ptrie.Trie[string]
|
pathToStore ptrie.Trie[string]
|
||||||
storeIdToStore map[string]FilerStore
|
storeIdToStore map[string]FilerStore
|
||||||
hasPathSpecificStore bool // fast check to skip MatchPrefix when no path-specific stores
|
hasPathSpecificStore bool // fast check to skip MatchPrefix when no path-specific stores
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,9 +2,10 @@ package hbase
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/seaweedfs/seaweedfs/weed/filer"
|
"github.com/seaweedfs/seaweedfs/weed/filer"
|
||||||
"github.com/tsuna/gohbase/hrpc"
|
"github.com/tsuna/gohbase/hrpc"
|
||||||
"time"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|||||||
@@ -2,8 +2,9 @@ package filer
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/stretchr/testify/assert"
|
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
)
|
)
|
||||||
|
|
||||||
type IntervalInt int
|
type IntervalInt int
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package leveldb
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/seaweedfs/seaweedfs/weed/filer"
|
"github.com/seaweedfs/seaweedfs/weed/filer"
|
||||||
"github.com/syndtr/goleveldb/leveldb"
|
"github.com/syndtr/goleveldb/leveldb"
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -3,12 +3,12 @@ package leveldb
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/pb"
|
|
||||||
"os"
|
"os"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/seaweedfs/seaweedfs/weed/filer"
|
"github.com/seaweedfs/seaweedfs/weed/filer"
|
||||||
|
"github.com/seaweedfs/seaweedfs/weed/pb"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/util"
|
"github.com/seaweedfs/seaweedfs/weed/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -2,10 +2,10 @@ package leveldb
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/pb"
|
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/seaweedfs/seaweedfs/weed/filer"
|
"github.com/seaweedfs/seaweedfs/weed/filer"
|
||||||
|
"github.com/seaweedfs/seaweedfs/weed/pb"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/util"
|
"github.com/seaweedfs/seaweedfs/weed/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
package leveldb
|
package leveldb
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/seaweedfs/seaweedfs/weed/filer"
|
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
|
"github.com/seaweedfs/seaweedfs/weed/filer"
|
||||||
)
|
)
|
||||||
|
|
||||||
var _ filer.BucketAware = (*LevelDB3Store)(nil)
|
var _ filer.BucketAware = (*LevelDB3Store)(nil)
|
||||||
|
|||||||
@@ -2,10 +2,10 @@ package leveldb
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/pb"
|
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/seaweedfs/seaweedfs/weed/filer"
|
"github.com/seaweedfs/seaweedfs/weed/filer"
|
||||||
|
"github.com/seaweedfs/seaweedfs/weed/pb"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/util"
|
"github.com/seaweedfs/seaweedfs/weed/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -5,14 +5,13 @@ import (
|
|||||||
"crypto/x509"
|
"crypto/x509"
|
||||||
"database/sql"
|
"database/sql"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/go-sql-driver/mysql"
|
|
||||||
"os"
|
"os"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/seaweedfs/seaweedfs/weed/filer"
|
"github.com/go-sql-driver/mysql"
|
||||||
|
|
||||||
_ "github.com/go-sql-driver/mysql"
|
_ "github.com/go-sql-driver/mysql"
|
||||||
|
"github.com/seaweedfs/seaweedfs/weed/filer"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/filer/abstract_sql"
|
"github.com/seaweedfs/seaweedfs/weed/filer/abstract_sql"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/util"
|
"github.com/seaweedfs/seaweedfs/weed/util"
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package filer
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
"github.com/seaweedfs/seaweedfs/weed/pb/filer_pb"
|
"github.com/seaweedfs/seaweedfs/weed/pb/filer_pb"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/pb/remote_pb"
|
"github.com/seaweedfs/seaweedfs/weed/pb/remote_pb"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/util"
|
"github.com/seaweedfs/seaweedfs/weed/util"
|
||||||
|
|||||||
@@ -311,7 +311,7 @@ func TestSingleChunkCacherDoneSignal(t *testing.T) {
|
|||||||
// TestSingleChunkCacherLookupError tests handling of lookup errors
|
// TestSingleChunkCacherLookupError tests handling of lookup errors
|
||||||
func TestSingleChunkCacherLookupError(t *testing.T) {
|
func TestSingleChunkCacherLookupError(t *testing.T) {
|
||||||
cache := newMockChunkCacheForReaderCache()
|
cache := newMockChunkCacheForReaderCache()
|
||||||
|
|
||||||
// Lookup function that returns an error
|
// Lookup function that returns an error
|
||||||
lookupFn := func(ctx context.Context, fileId string) ([]string, error) {
|
lookupFn := func(ctx context.Context, fileId string) ([]string, error) {
|
||||||
return nil, fmt.Errorf("lookup failed for %s", fileId)
|
return nil, fmt.Errorf("lookup failed for %s", fileId)
|
||||||
@@ -322,7 +322,7 @@ func TestSingleChunkCacherLookupError(t *testing.T) {
|
|||||||
|
|
||||||
buffer := make([]byte, 100)
|
buffer := make([]byte, 100)
|
||||||
_, err := rc.ReadChunkAt(context.Background(), buffer, "error-test", nil, false, 0, 100, true)
|
_, err := rc.ReadChunkAt(context.Background(), buffer, "error-test", nil, false, 0, 100, true)
|
||||||
|
|
||||||
if err == nil {
|
if err == nil {
|
||||||
t.Error("Expected an error, got nil")
|
t.Error("Expected an error, got nil")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,11 @@
|
|||||||
package redis2
|
package redis2
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/redis/go-redis/v9"
|
"github.com/redis/go-redis/v9"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/filer"
|
"github.com/seaweedfs/seaweedfs/weed/filer"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/util"
|
"github.com/seaweedfs/seaweedfs/weed/util"
|
||||||
"time"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
|||||||
@@ -3,11 +3,12 @@ package redis3
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/redis/go-redis/v9"
|
|
||||||
"github.com/stvp/tempredis"
|
|
||||||
"strconv"
|
"strconv"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/redis/go-redis/v9"
|
||||||
|
"github.com/stvp/tempredis"
|
||||||
)
|
)
|
||||||
|
|
||||||
var names = []string{
|
var names = []string{
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package redis3
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/redis/go-redis/v9"
|
"github.com/redis/go-redis/v9"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/glog"
|
"github.com/seaweedfs/seaweedfs/weed/glog"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/util/skiplist"
|
"github.com/seaweedfs/seaweedfs/weed/util/skiplist"
|
||||||
|
|||||||
@@ -1,10 +1,11 @@
|
|||||||
package redis_lua
|
package redis_lua
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/redis/go-redis/v9"
|
"github.com/redis/go-redis/v9"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/filer"
|
"github.com/seaweedfs/seaweedfs/weed/filer"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/util"
|
"github.com/seaweedfs/seaweedfs/weed/util"
|
||||||
"time"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package stored_procedure
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
_ "embed"
|
_ "embed"
|
||||||
|
|
||||||
"github.com/redis/go-redis/v9"
|
"github.com/redis/go-redis/v9"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package filer
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/seaweedfs/seaweedfs/weed/pb"
|
"github.com/seaweedfs/seaweedfs/weed/pb"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/pb/filer_pb"
|
"github.com/seaweedfs/seaweedfs/weed/pb/filer_pb"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/pb/remote_pb"
|
"github.com/seaweedfs/seaweedfs/weed/pb/remote_pb"
|
||||||
|
|||||||
@@ -3,14 +3,15 @@ package filer
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"math"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"github.com/seaweedfs/seaweedfs/weed/pb"
|
"github.com/seaweedfs/seaweedfs/weed/pb"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/pb/remote_pb"
|
"github.com/seaweedfs/seaweedfs/weed/pb/remote_pb"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/remote_storage"
|
"github.com/seaweedfs/seaweedfs/weed/remote_storage"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/util"
|
"github.com/seaweedfs/seaweedfs/weed/util"
|
||||||
"google.golang.org/grpc"
|
"google.golang.org/grpc"
|
||||||
"google.golang.org/protobuf/proto"
|
"google.golang.org/protobuf/proto"
|
||||||
"math"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/seaweedfs/seaweedfs/weed/glog"
|
"github.com/seaweedfs/seaweedfs/weed/glog"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/pb/filer_pb"
|
"github.com/seaweedfs/seaweedfs/weed/pb/filer_pb"
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
package filer
|
package filer
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
"github.com/seaweedfs/seaweedfs/weed/pb/remote_pb"
|
"github.com/seaweedfs/seaweedfs/weed/pb/remote_pb"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"testing"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestFilerRemoteStorage_FindRemoteStorageClient(t *testing.T) {
|
func TestFilerRemoteStorage_FindRemoteStorageClient(t *testing.T) {
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ package ydb
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/seaweedfs/seaweedfs/weed/filer"
|
"github.com/seaweedfs/seaweedfs/weed/filer"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/filer/abstract_sql"
|
"github.com/seaweedfs/seaweedfs/weed/filer/abstract_sql"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/util"
|
"github.com/seaweedfs/seaweedfs/weed/util"
|
||||||
|
|||||||
@@ -4,8 +4,9 @@
|
|||||||
package ydb
|
package ydb
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/seaweedfs/seaweedfs/weed/filer/store_test"
|
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/seaweedfs/seaweedfs/weed/filer/store_test"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestStore(t *testing.T) {
|
func TestStore(t *testing.T) {
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ package ydb
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/ydb-platform/ydb-go-sdk/v3/table"
|
"github.com/ydb-platform/ydb-go-sdk/v3/table"
|
||||||
"github.com/ydb-platform/ydb-go-sdk/v3/table/options"
|
"github.com/ydb-platform/ydb-go-sdk/v3/table/options"
|
||||||
"github.com/ydb-platform/ydb-go-sdk/v3/table/types"
|
"github.com/ydb-platform/ydb-go-sdk/v3/table/types"
|
||||||
|
|||||||
@@ -21,7 +21,6 @@ package glog
|
|||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
flag "github.com/seaweedfs/seaweedfs/weed/util/fla9"
|
|
||||||
"os"
|
"os"
|
||||||
"os/user"
|
"os/user"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
@@ -29,6 +28,8 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
flag "github.com/seaweedfs/seaweedfs/weed/util/fla9"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MaxSize is the maximum size of a log file in bytes.
|
// MaxSize is the maximum size of a log file in bytes.
|
||||||
|
|||||||
@@ -42,16 +42,16 @@ const (
|
|||||||
|
|
||||||
// Configuration Field Names
|
// Configuration Field Names
|
||||||
const (
|
const (
|
||||||
ConfigFieldFilerAddress = "filerAddress"
|
ConfigFieldFilerAddress = "filerAddress"
|
||||||
ConfigFieldBasePath = "basePath"
|
ConfigFieldBasePath = "basePath"
|
||||||
ConfigFieldIssuer = "issuer"
|
ConfigFieldIssuer = "issuer"
|
||||||
ConfigFieldClientID = "clientId"
|
ConfigFieldClientID = "clientId"
|
||||||
ConfigFieldClientSecret = "clientSecret"
|
ConfigFieldClientSecret = "clientSecret"
|
||||||
ConfigFieldJWKSUri = "jwksUri"
|
ConfigFieldJWKSUri = "jwksUri"
|
||||||
ConfigFieldScopes = "scopes"
|
ConfigFieldScopes = "scopes"
|
||||||
ConfigFieldUserInfoUri = "userInfoUri"
|
ConfigFieldUserInfoUri = "userInfoUri"
|
||||||
ConfigFieldRedirectUri = "redirectUri"
|
ConfigFieldRedirectUri = "redirectUri"
|
||||||
ConfigFieldTLSCACert = "tlsCaCert"
|
ConfigFieldTLSCACert = "tlsCaCert"
|
||||||
ConfigFieldTLSInsecureSkipVerify = "tlsInsecureSkipVerify"
|
ConfigFieldTLSInsecureSkipVerify = "tlsInsecureSkipVerify"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -457,7 +457,7 @@ func TestSessionDurationCappedByTokenExpiration(t *testing.T) {
|
|||||||
service := NewSTSService()
|
service := NewSTSService()
|
||||||
|
|
||||||
config := &STSConfig{
|
config := &STSConfig{
|
||||||
TokenDuration: FlexibleDuration{time.Hour}, // Default: 1 hour
|
TokenDuration: FlexibleDuration{time.Hour}, // Default: 1 hour
|
||||||
MaxSessionLength: FlexibleDuration{time.Hour * 12},
|
MaxSessionLength: FlexibleDuration{time.Hour * 12},
|
||||||
Issuer: "test-sts",
|
Issuer: "test-sts",
|
||||||
SigningKey: []byte("test-signing-key-32-characters-long"),
|
SigningKey: []byte("test-signing-key-32-characters-long"),
|
||||||
|
|||||||
@@ -453,10 +453,10 @@ func TestSecurityMaliciousSTSUserARNs(t *testing.T) {
|
|||||||
// should be accepted as a valid role name "role/name".
|
// should be accepted as a valid role name "role/name".
|
||||||
func TestEdgeCaseMultipleRoleMarkers(t *testing.T) {
|
func TestEdgeCaseMultipleRoleMarkers(t *testing.T) {
|
||||||
testCases := []struct {
|
testCases := []struct {
|
||||||
name string
|
name string
|
||||||
arn string
|
arn string
|
||||||
expected string
|
expected string
|
||||||
useSTS bool
|
useSTS bool
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
name: "legacy_format_role_in_path",
|
name: "legacy_format_role_in_path",
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
package images
|
package images
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/seaweedfs/seaweedfs/weed/util"
|
|
||||||
"os"
|
"os"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/seaweedfs/seaweedfs/weed/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestXYZ(t *testing.T) {
|
func TestXYZ(t *testing.T) {
|
||||||
|
|||||||
@@ -2,9 +2,10 @@ package images
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/util"
|
|
||||||
"os"
|
"os"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/seaweedfs/seaweedfs/weed/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestResizing(t *testing.T) {
|
func TestResizing(t *testing.T) {
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
package mount
|
package mount
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/seaweedfs/seaweedfs/weed/util"
|
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/seaweedfs/seaweedfs/weed/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestInodeEntry_removeOnePath(t *testing.T) {
|
func TestInodeEntry_removeOnePath(t *testing.T) {
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
package mount
|
package mount
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/seaweedfs/seaweedfs/weed/pb/filer_pb"
|
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
|
"github.com/seaweedfs/seaweedfs/weed/pb/filer_pb"
|
||||||
)
|
)
|
||||||
|
|
||||||
type LockedEntry struct {
|
type LockedEntry struct {
|
||||||
|
|||||||
@@ -19,8 +19,8 @@ import (
|
|||||||
// e.g. fill fileId field for chunks
|
// e.g. fill fileId field for chunks
|
||||||
|
|
||||||
type MetaCache struct {
|
type MetaCache struct {
|
||||||
root util.FullPath
|
root util.FullPath
|
||||||
localStore filer.VirtualFilerStore
|
localStore filer.VirtualFilerStore
|
||||||
leveldbStore *leveldb.LevelDBStore // direct reference for batch operations
|
leveldbStore *leveldb.LevelDBStore // direct reference for batch operations
|
||||||
sync.RWMutex
|
sync.RWMutex
|
||||||
uidGidMapper *UidGidMapper
|
uidGidMapper *UidGidMapper
|
||||||
|
|||||||
@@ -2,12 +2,13 @@ package meta_cache
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"github.com/seaweedfs/seaweedfs/weed/filer"
|
"github.com/seaweedfs/seaweedfs/weed/filer"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/glog"
|
"github.com/seaweedfs/seaweedfs/weed/glog"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/pb"
|
"github.com/seaweedfs/seaweedfs/weed/pb"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/pb/filer_pb"
|
"github.com/seaweedfs/seaweedfs/weed/pb/filer_pb"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/util"
|
"github.com/seaweedfs/seaweedfs/weed/util"
|
||||||
"strings"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type MetadataFollower struct {
|
type MetadataFollower struct {
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
package page_writer
|
package page_writer
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/stretchr/testify/assert"
|
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
)
|
)
|
||||||
|
|
||||||
func Test_PageChunkWrittenIntervalList(t *testing.T) {
|
func Test_PageChunkWrittenIntervalList(t *testing.T) {
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package mount
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
"github.com/seaweedfs/seaweedfs/weed/util"
|
"github.com/seaweedfs/seaweedfs/weed/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package mount
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/seaweedfs/seaweedfs/weed/glog"
|
"github.com/seaweedfs/seaweedfs/weed/glog"
|
||||||
"github.com/seaweedfs/seaweedfs/weed/pb/mount_pb"
|
"github.com/seaweedfs/seaweedfs/weed/pb/mount_pb"
|
||||||
)
|
)
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user