| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 package dscache | 5 package dscache |
| 6 | 6 |
| 7 import ( | 7 import ( |
| 8 "fmt" | 8 "fmt" |
| 9 "math/rand" | 9 "math/rand" |
| 10 "time" | 10 "time" |
| 11 | 11 |
| 12 ds "github.com/luci/gae/service/datastore" | 12 ds "github.com/luci/gae/service/datastore" |
| 13 "github.com/luci/gae/service/memcache" | 13 "github.com/luci/gae/service/memcache" |
| 14 "github.com/luci/luci-go/common/errors" |
| 14 log "github.com/luci/luci-go/common/logging" | 15 log "github.com/luci/luci-go/common/logging" |
| 15 "golang.org/x/net/context" | 16 "golang.org/x/net/context" |
| 16 ) | 17 ) |
| 17 | 18 |
| 18 type supportContext struct { | 19 type supportContext struct { |
| 19 aid string | 20 aid string |
| 20 ns string | 21 ns string |
| 21 | 22 |
| 22 c context.Context | 23 c context.Context |
| 23 mc memcache.Interface | 24 mc memcache.Interface |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 110 } | 111 } |
| 111 if err := s.mc.SetMulti(lockItems); err != nil { | 112 if err := s.mc.SetMulti(lockItems); err != nil { |
| 112 // this is a hard failure. No mutation can occur if we're unable
to set | 113 // this is a hard failure. No mutation can occur if we're unable
to set |
| 113 // locks out. See "DANGER ZONE" in the docs. | 114 // locks out. See "DANGER ZONE" in the docs. |
| 114 (log.Fields{log.ErrorKey: err}).Errorf( | 115 (log.Fields{log.ErrorKey: err}).Errorf( |
| 115 s.c, "dscache: HARD FAILURE: supportContext.mutation():
mc.SetMulti") | 116 s.c, "dscache: HARD FAILURE: supportContext.mutation():
mc.SetMulti") |
| 116 return err | 117 return err |
| 117 } | 118 } |
| 118 err := f() | 119 err := f() |
| 119 if err == nil { | 120 if err == nil { |
| 120 » » if err := s.mc.DeleteMulti(lockKeys); err != nil { | 121 » » if err := errors.Filter(s.mc.DeleteMulti(lockKeys), memcache.Err
CacheMiss); err != nil { |
| 121 (log.Fields{log.ErrorKey: err}).Warningf( | 122 (log.Fields{log.ErrorKey: err}).Warningf( |
| 122 s.c, "dscache: mc.DeleteMulti") | 123 s.c, "dscache: mc.DeleteMulti") |
| 123 } | 124 } |
| 124 } | 125 } |
| 125 return err | 126 return err |
| 126 } | 127 } |
| 127 | 128 |
| 128 func (s *supportContext) mkRandLockItems(keys []*ds.Key, metas ds.MultiMetaGette
r) ([]memcache.Item, []byte) { | 129 func (s *supportContext) mkRandLockItems(keys []*ds.Key, metas ds.MultiMetaGette
r) ([]memcache.Item, []byte) { |
| 129 mcKeys := s.mkRandKeys(keys, metas) | 130 mcKeys := s.mkRandKeys(keys, metas) |
| 130 if len(mcKeys) == 0 { | 131 if len(mcKeys) == 0 { |
| (...skipping 19 matching lines...) Expand all Loading... |
| 150 return nil, nil | 151 return nil, nil |
| 151 } | 152 } |
| 152 ret := make([]memcache.Item, len(mcKeys)) | 153 ret := make([]memcache.Item, len(mcKeys)) |
| 153 for i := range ret { | 154 for i := range ret { |
| 154 ret[i] = (s.mc.NewItem(mcKeys[i]). | 155 ret[i] = (s.mc.NewItem(mcKeys[i]). |
| 155 SetFlags(uint32(ItemHasLock)). | 156 SetFlags(uint32(ItemHasLock)). |
| 156 SetExpiration(time.Second * time.Duration(LockTimeSecond
s))) | 157 SetExpiration(time.Second * time.Duration(LockTimeSecond
s))) |
| 157 } | 158 } |
| 158 return ret, mcKeys | 159 return ret, mcKeys |
| 159 } | 160 } |
| OLD | NEW |