[ARVADOS] created: 1.3.0-1898-g35ed9c4e3
Git user
git at public.curoverse.com
Thu Nov 21 17:35:58 UTC 2019
at 35ed9c4e39306ddbeebdf0445149be72c1cc5284 (commit)
commit 35ed9c4e39306ddbeebdf0445149be72c1cc5284
Author: Tom Clegg <tclegg at veritasgenetics.com>
Date: Thu Nov 21 12:34:45 2019 -0500
15848: Fix incorrect order in federation query response.
Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tclegg at veritasgenetics.com>
diff --git a/lib/controller/federation/generated.go b/lib/controller/federation/generated.go
index b34b9b165..9d5a96288 100755
--- a/lib/controller/federation/generated.go
+++ b/lib/controller/federation/generated.go
@@ -8,6 +8,7 @@ import (
"context"
"sort"
"sync"
+ "sync/atomic"
"git.curoverse.com/arvados.git/sdk/go/arvados"
)
@@ -19,6 +20,8 @@ import (
func (conn *Conn) ContainerList(ctx context.Context, options arvados.ListOptions) (arvados.ContainerList, error) {
var mtx sync.Mutex
var merged arvados.ContainerList
+ var needSort atomic.Value
+ needSort.Store(false)
err := conn.splitListRequest(ctx, options, func(ctx context.Context, _ string, backend arvados.API, options arvados.ListOptions) ([]string, error) {
cl, err := backend.ContainerList(ctx, options)
if err != nil {
@@ -28,8 +31,9 @@ func (conn *Conn) ContainerList(ctx context.Context, options arvados.ListOptions
defer mtx.Unlock()
if len(merged.Items) == 0 {
merged = cl
- } else {
+ } else if len(cl.Items) > 0 {
merged.Items = append(merged.Items, cl.Items...)
+ needSort.Store(true)
}
uuids := make([]string, 0, len(cl.Items))
for _, item := range cl.Items {
@@ -37,13 +41,25 @@ func (conn *Conn) ContainerList(ctx context.Context, options arvados.ListOptions
}
return uuids, nil
})
- sort.Slice(merged.Items, func(i, j int) bool { return merged.Items[i].UUID < merged.Items[j].UUID })
+ if needSort.Load().(bool) {
+ // Apply the default/implied order, "modified_at desc"
+ sort.Slice(merged.Items, func(i, j int) bool {
+ mi, mj := merged.Items[i].ModifiedAt, merged.Items[j].ModifiedAt
+ if mi == nil || mj == nil {
+ return false
+ } else {
+ return mj.Before(*mi)
+ }
+ })
+ }
return merged, err
}
func (conn *Conn) SpecimenList(ctx context.Context, options arvados.ListOptions) (arvados.SpecimenList, error) {
var mtx sync.Mutex
var merged arvados.SpecimenList
+ var needSort atomic.Value
+ needSort.Store(false)
err := conn.splitListRequest(ctx, options, func(ctx context.Context, _ string, backend arvados.API, options arvados.ListOptions) ([]string, error) {
cl, err := backend.SpecimenList(ctx, options)
if err != nil {
@@ -53,8 +69,9 @@ func (conn *Conn) SpecimenList(ctx context.Context, options arvados.ListOptions)
defer mtx.Unlock()
if len(merged.Items) == 0 {
merged = cl
- } else {
+ } else if len(cl.Items) > 0 {
merged.Items = append(merged.Items, cl.Items...)
+ needSort.Store(true)
}
uuids := make([]string, 0, len(cl.Items))
for _, item := range cl.Items {
@@ -62,6 +79,16 @@ func (conn *Conn) SpecimenList(ctx context.Context, options arvados.ListOptions)
}
return uuids, nil
})
- sort.Slice(merged.Items, func(i, j int) bool { return merged.Items[i].UUID < merged.Items[j].UUID })
+ if needSort.Load().(bool) {
+ // Apply the default/implied order, "modified_at desc"
+ sort.Slice(merged.Items, func(i, j int) bool {
+ mi, mj := merged.Items[i].ModifiedAt, merged.Items[j].ModifiedAt
+ if mi == nil || mj == nil {
+ return false
+ } else {
+ return mj.Before(*mi)
+ }
+ })
+ }
return merged, err
}
diff --git a/lib/controller/federation/list.go b/lib/controller/federation/list.go
index 6ba184c47..c215a4d03 100644
--- a/lib/controller/federation/list.go
+++ b/lib/controller/federation/list.go
@@ -10,6 +10,7 @@ import (
"net/http"
"sort"
"sync"
+ "sync/atomic"
"git.curoverse.com/arvados.git/sdk/go/arvados"
"git.curoverse.com/arvados.git/sdk/go/httpserver"
@@ -23,6 +24,8 @@ import (
func (conn *Conn) CollectionList(ctx context.Context, options arvados.ListOptions) (arvados.CollectionList, error) {
var mtx sync.Mutex
var merged arvados.CollectionList
+ var needSort atomic.Value
+ needSort.Store(false)
err := conn.splitListRequest(ctx, options, func(ctx context.Context, _ string, backend arvados.API, options arvados.ListOptions) ([]string, error) {
cl, err := backend.CollectionList(ctx, options)
if err != nil {
@@ -32,8 +35,9 @@ func (conn *Conn) CollectionList(ctx context.Context, options arvados.ListOption
defer mtx.Unlock()
if len(merged.Items) == 0 {
merged = cl
- } else {
+ } else if len(cl.Items) > 0 {
merged.Items = append(merged.Items, cl.Items...)
+ needSort.Store(true)
}
uuids := make([]string, 0, len(cl.Items))
for _, item := range cl.Items {
@@ -41,7 +45,17 @@ func (conn *Conn) CollectionList(ctx context.Context, options arvados.ListOption
}
return uuids, nil
})
- sort.Slice(merged.Items, func(i, j int) bool { return merged.Items[i].UUID < merged.Items[j].UUID })
+ if needSort.Load().(bool) {
+ // Apply the default/implied order, "modified_at desc"
+ sort.Slice(merged.Items, func(i, j int) bool {
+ mi, mj := merged.Items[i].ModifiedAt, merged.Items[j].ModifiedAt
+ if mi == nil || mj == nil {
+ return false
+ } else {
+ return mj.Before(*mi)
+ }
+ })
+ }
return merged, err
}
diff --git a/lib/controller/federation/list_test.go b/lib/controller/federation/list_test.go
index c9b981fc1..8f198a23c 100644
--- a/lib/controller/federation/list_test.go
+++ b/lib/controller/federation/list_test.go
@@ -10,6 +10,7 @@ import (
"net/http"
"net/url"
"os"
+ "sort"
"testing"
"git.curoverse.com/arvados.git/lib/controller/router"
@@ -430,6 +431,9 @@ func (s *CollectionListSuite) test(c *check.C, trial listTrial) {
for _, uuid := range trial.expectUUIDs {
expectItems = append(expectItems, arvados.Collection{UUID: uuid})
}
+ // expectItems is sorted by UUID, so sort resp.Items
+ // by UUID before checking DeepEquals.
+ sort.Slice(resp.Items, func(i, j int) bool { return resp.Items[i].UUID < resp.Items[j].UUID })
c.Check(resp, check.DeepEquals, arvados.CollectionList{
Items: expectItems,
})
diff --git a/sdk/go/arvados/container.go b/sdk/go/arvados/container.go
index fb095481b..0a75b236e 100644
--- a/sdk/go/arvados/container.go
+++ b/sdk/go/arvados/container.go
@@ -9,7 +9,10 @@ import "time"
// Container is an arvados#container resource.
type Container struct {
UUID string `json:"uuid"`
- CreatedAt time.Time `json:"created_at"`
+ CreatedAt *time.Time `json:"created_at"`
+ ModifiedByClientUUID string `json:"modified_by_client_uuid"`
+ ModifiedByUserUUID string `json:"modified_by_user_uuid"`
+ ModifiedAt *time.Time `json:"modified_at"`
Command []string `json:"command"`
ContainerImage string `json:"container_image"`
Cwd string `json:"cwd"`
diff --git a/sdk/go/arvados/specimen.go b/sdk/go/arvados/specimen.go
index e320ca2c3..3b3b1629f 100644
--- a/sdk/go/arvados/specimen.go
+++ b/sdk/go/arvados/specimen.go
@@ -9,9 +9,8 @@ import "time"
type Specimen struct {
UUID string `json:"uuid"`
OwnerUUID string `json:"owner_uuid"`
- CreatedAt time.Time `json:"created_at"`
- ModifiedAt time.Time `json:"modified_at"`
- UpdatedAt time.Time `json:"updated_at"`
+ CreatedAt *time.Time `json:"created_at"`
+ ModifiedAt *time.Time `json:"modified_at"`
Properties map[string]interface{} `json:"properties"`
}
-----------------------------------------------------------------------
hooks/post-receive
--
More information about the arvados-commits
mailing list