1
0
Fork 0
mirror of https://github.com/anyproto/anytype-heart.git synced 2025-06-10 18:10:49 +09:00

GO-3062 Implement write-read limits update

This commit is contained in:
mcrakhman 2024-03-18 21:17:23 +01:00
parent 63995c458a
commit 22fd2ff418
No known key found for this signature in database
GPG key ID: DED12CFEF5B8396B
17 changed files with 125 additions and 30 deletions

View file

@ -144,6 +144,8 @@ func (s *SpaceView) setSpaceLocalInfo(st *state.State, info spaceinfo.SpaceLocal
st.SetLocalDetail(bundle.RelationKeyTargetSpaceId.String(), pbtypes.String(info.SpaceID))
st.SetLocalDetail(bundle.RelationKeySpaceLocalStatus.String(), pbtypes.Int64(int64(info.LocalStatus)))
st.SetLocalDetail(bundle.RelationKeySpaceRemoteStatus.String(), pbtypes.Int64(int64(info.RemoteStatus)))
st.SetLocalDetail(bundle.RelationKeySpaceMembersWriteLimit.String(), pbtypes.Int64(int64(info.WriteLimit)))
st.SetLocalDetail(bundle.RelationKeySpaceMembersReadLimit.String(), pbtypes.Int64(int64(info.ReadLimit)))
s.log.Infof("set space local status: %s, remote status: %s", info.LocalStatus.String(), info.RemoteStatus.String())
}

View file

@ -16,13 +16,32 @@ type rpcHandler struct {
spaceStorage storage.ClientStorage
}
func (r *rpcHandler) BlockPush(ctx context.Context, request *fileproto.BlockPushRequest) (*fileproto.Ok, error) {
return nil, fileprotoerr.ErrForbidden
}
func (r *rpcHandler) BlocksBind(ctx context.Context, request *fileproto.BlocksBindRequest) (*fileproto.Ok, error) {
return nil, fileprotoerr.ErrForbidden
}
func (r *rpcHandler) FilesGet(request *fileproto.FilesGetRequest, stream fileproto.DRPCFile_FilesGetStream) error {
return fileprotoerr.ErrForbidden
}
func (r *rpcHandler) AccountLimitSet(ctx context.Context, request *fileproto.AccountLimitSetRequest) (*fileproto.Ok, error) {
return nil, fileprotoerr.ErrForbidden
}
func (r *rpcHandler) SpaceLimitSet(ctx context.Context, request *fileproto.SpaceLimitSetRequest) (*fileproto.Ok, error) {
return nil, fileprotoerr.ErrForbidden
}
func (r *rpcHandler) FilesDelete(ctx context.Context, request *fileproto.FilesDeleteRequest) (*fileproto.FilesDeleteResponse, error) {
return nil, fileprotoerr.ErrForbidden
}
func (r *rpcHandler) FilesInfo(ctx context.Context, request *fileproto.FilesInfoRequest) (*fileproto.FilesInfoResponse, error) {
return nil, fileprotoerr.ErrForbidden
}
func (r *rpcHandler) SpaceInfo(ctx context.Context, request *fileproto.SpaceInfoRequest) (*fileproto.SpaceInfoResponse, error) {
@ -50,11 +69,6 @@ func (r *rpcHandler) BlockGet(ctx context.Context, req *fileproto.BlockGetReques
return
}
func (r *rpcHandler) BlockPush(ctx context.Context, req *fileproto.BlockPushRequest) (*fileproto.BlockPushResponse, error) {
return nil, fileprotoerr.ErrForbidden
}
func (r *rpcHandler) BlocksCheck(ctx context.Context, req *fileproto.BlocksCheckRequest) (*fileproto.BlocksCheckResponse, error) {
cids := make([]cid.Cid, 0, len(req.Cids))
for _, cd := range req.Cids {
@ -72,10 +86,6 @@ func (r *rpcHandler) BlocksCheck(ctx context.Context, req *fileproto.BlocksCheck
}, nil
}
func (r *rpcHandler) BlocksBind(ctx context.Context, req *fileproto.BlocksBindRequest) (*fileproto.BlocksBindResponse, error) {
return nil, fileprotoerr.ErrForbidden
}
func (r *rpcHandler) Check(ctx context.Context, request *fileproto.CheckRequest) (resp *fileproto.CheckResponse, err error) {
resp = &fileproto.CheckResponse{
AllowWrite: false,

4
go.mod
View file

@ -7,7 +7,7 @@ require (
github.com/PuerkitoBio/goquery v1.9.1
github.com/VividCortex/ewma v1.2.0
github.com/adrium/goheif v0.0.0-20230113233934-ca402e77a786
github.com/anyproto/any-sync v0.3.32
github.com/anyproto/any-sync v0.3.34-0.20240318171113-37270166778b
github.com/anyproto/go-naturaldate/v2 v2.0.2-0.20230524105841-9829cfd13438
github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de
github.com/blevesearch/bleve/v2 v2.3.10
@ -96,7 +96,7 @@ require (
google.golang.org/grpc v1.62.1
gopkg.in/Graylog2/go-gelf.v2 v2.0.0-20180125164251-1832d8546a9f
gopkg.in/yaml.v3 v3.0.1
storj.io/drpc v0.0.33
storj.io/drpc v0.0.34
)

4
go.sum
View file

@ -91,6 +91,8 @@ github.com/andybalholm/cascadia v1.3.2 h1:3Xi6Dw5lHF15JtdcmAHD3i1+T8plmv7BQ/nsVi
github.com/andybalholm/cascadia v1.3.2/go.mod h1:7gtRlve5FxPPgIgX36uWBX58OdBsSS6lUvCFb+h7KvU=
github.com/anyproto/any-sync v0.3.32 h1:SKSzA4YOCVPwdT6Mf9p0yKnRE3xkvax/EUflspd5pbY=
github.com/anyproto/any-sync v0.3.32/go.mod h1:q7O3a4p3DwhFzIACjh6I6rv2RzgqPQesZNZv27B8Xdo=
github.com/anyproto/any-sync v0.3.34-0.20240318171113-37270166778b h1:n1S4s1IeMIBnV0JwGcTekfnqHfLf3ibbdDveDFh5pYc=
github.com/anyproto/any-sync v0.3.34-0.20240318171113-37270166778b/go.mod h1:/SXsrmYZz51c5CJMV79h3RCxqyL2o3S4Wd9/fjhAt4M=
github.com/anyproto/badger/v4 v4.2.1-0.20240110160636-80743fa3d580 h1:Ba80IlCCxkZ9H1GF+7vFu/TSpPvbpDCxXJ5ogc4euYc=
github.com/anyproto/badger/v4 v4.2.1-0.20240110160636-80743fa3d580/go.mod h1:T/uWAYxrXdaXw64ihI++9RMbKTCpKd/yE9+saARew7k=
github.com/anyproto/go-chash v0.1.0 h1:I9meTPjXFRfXZHRJzjOHC/XF7Q5vzysKkiT/grsogXY=
@ -2036,3 +2038,5 @@ sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=
sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU=
storj.io/drpc v0.0.33 h1:yCGZ26r66ZdMP0IcTYsj7WDAUIIjzXk6DJhbhvt9FHI=
storj.io/drpc v0.0.33/go.mod h1:vR804UNzhBa49NOJ6HeLjd2H3MakC1j5Gv8bsOQT6N4=
storj.io/drpc v0.0.34 h1:q9zlQKfJ5A7x8NQNFk8x7eKUF78FMhmAbZLnFK+og7I=
storj.io/drpc v0.0.34/go.mod h1:Y9LZaa8esL1PW2IDMqJE7CFSNq7d5bQ3RI7mGPtmKMg=

View file

@ -9,7 +9,7 @@ import (
"github.com/anyproto/anytype-heart/pkg/lib/pb/model"
)
const RelationChecksum = "182c2b3268428bd633d4a92322070958e778a9c54d4dfd9b66d8ca416f80ca17"
const RelationChecksum = "1fe26c5c7e1e64a1f8894a2770e27ea046b8f94686a20a21bdda696f9fb17aad"
const (
RelationKeyTag domain.RelationKey = "tag"
RelationKeyCamera domain.RelationKey = "camera"
@ -26,6 +26,8 @@ const (
RelationKeyTemplateIsBundled domain.RelationKey = "templateIsBundled"
RelationKeyDateOfBirth domain.RelationKey = "dateOfBirth"
RelationKeyRestrictions domain.RelationKey = "restrictions"
RelationKeySpaceMembersReadLimit domain.RelationKey = "spaceMembersReadLimit"
RelationKeySpaceMembersWriteLimit domain.RelationKey = "spaceMembersWriteLimit"
RelationKeyIsHighlighted domain.RelationKey = "isHighlighted"
RelationKeyThumbnailImage domain.RelationKey = "thumbnailImage"
RelationKeyAttachments domain.RelationKey = "attachments"
@ -2096,6 +2098,34 @@ var (
ReadOnlyRelation: true,
Scope: model.Relation_type,
},
RelationKeySpaceMembersReadLimit: {
DataSource: model.Relation_details,
Description: "Space members read limit",
Format: model.RelationFormat_number,
Hidden: true,
Id: "_brspaceMembersReadLimit",
Key: "spaceMembersReadLimit",
MaxCount: 1,
Name: "Space members read limit",
ReadOnly: true,
ReadOnlyRelation: true,
Scope: model.Relation_type,
},
RelationKeySpaceMembersWriteLimit: {
DataSource: model.Relation_details,
Description: "Space members write limit",
Format: model.RelationFormat_number,
Hidden: true,
Id: "_brspaceMembersWriteLimit",
Key: "spaceMembersWriteLimit",
MaxCount: 1,
Name: "Space members write limit",
ReadOnly: true,
ReadOnlyRelation: true,
Scope: model.Relation_type,
},
RelationKeySpaceRemoteStatus: {
DataSource: model.Relation_derived,

View file

@ -146,6 +146,26 @@
"readonly": true,
"source": "derived"
},
{
"description": "Space members read limit",
"format": "number",
"hidden": true,
"key": "spaceMembersReadLimit",
"maxCount": 1,
"name": "Space members read limit",
"readonly": true,
"source": "derived"
},
{
"description": "Space members write limit",
"format": "number",
"hidden": true,
"key": "spaceMembersWriteLimit",
"maxCount": 1,
"name": "Space members write limit",
"readonly": true,
"source": "derived"
},
{
"description": "Adds the object to the highlighted dataview in space",
"format": "checkbox",

View file

@ -6,7 +6,7 @@ package bundle
import domain "github.com/anyproto/anytype-heart/core/domain"
const SystemRelationsChecksum = "f005078664bd162ec27289eeb2024aaddb83d3e9128bb25ee589ef914f4e055b"
const SystemRelationsChecksum = "182f66b62f27dfd9e7a2553eda4624bb1ac72b80707e7a6cf58391880b947613"
// SystemRelations contains relations that have some special biz logic depends on them in some objects
// in case EVERY object depend on the relation please add it to RequiredInternalRelations
@ -59,6 +59,8 @@ var SystemRelations = append(RequiredInternalRelations, []domain.RelationKey{
RelationKeySpaceAccessType,
RelationKeySpaceInviteFileCid,
RelationKeySpaceInviteFileKey,
RelationKeySpaceMembersReadLimit,
RelationKeySpaceMembersWriteLimit,
RelationKeyParticipantPermissions,
RelationKeyParticipantStatus,
RelationKeyLatestAclHeadId,

View file

@ -73,6 +73,8 @@
"spaceAccessType",
"spaceInviteFileCid",
"spaceInviteFileKey",
"spaceMembersReadLimit",
"spaceMembersWriteLimit",
"participantPermissions",
"participantStatus",
"latestAclHeadId",

View file

@ -38,7 +38,7 @@ func New() DeletionController {
}
type spaceManager interface {
UpdateRemoteStatus(ctx context.Context, spaceId string, status spaceinfo.RemoteStatus, isOwned bool) error
UpdateRemoteStatus(ctx context.Context, spaceStatusInfo spaceinfo.SpaceRemoteStatusInfo) error
AllSpaceIds() (ids []string)
}
@ -126,7 +126,16 @@ func (d *deletionController) updateStatuses(ctx context.Context) (ownedIds []str
ownedIds = append(ownedIds, ids[idx])
}
remoteStatus := convStatus(nodeStatus.Status)
err := d.spaceManager.UpdateRemoteStatus(ctx, ids[idx], remoteStatus, isOwned)
statusInfo := spaceinfo.SpaceRemoteStatusInfo{
SpaceId: ids[idx],
RemoteStatus: remoteStatus,
IsOwned: isOwned,
}
if nodeStatus.Limits != nil {
statusInfo.WriteLimit = nodeStatus.Limits.WriteMembers
statusInfo.ReadLimit = nodeStatus.Limits.ReadMembers
}
err := d.spaceManager.UpdateRemoteStatus(ctx, statusInfo)
if err != nil {
log.Warn("remote status update error", zap.Error(err), zap.String("spaceId", ids[idx]))
return

View file

@ -23,7 +23,7 @@ type SpaceStatus interface {
LatestAclHeadId() string
UpdatePersistentStatus(ctx context.Context, status spaceinfo.AccountStatus)
UpdatePersistentInfo(ctx context.Context, info spaceinfo.SpacePersistentInfo)
SetRemoteStatus(ctx context.Context, status spaceinfo.RemoteStatus) error
SetRemoteStatus(ctx context.Context, status spaceinfo.SpaceRemoteStatusInfo) error
SetPersistentStatus(ctx context.Context, status spaceinfo.AccountStatus) (err error)
SetPersistentInfo(ctx context.Context, info spaceinfo.SpacePersistentInfo) (err error)
SetLocalStatus(ctx context.Context, status spaceinfo.LocalStatus) error
@ -40,6 +40,8 @@ type spaceStatus struct {
latestAclHeadId string
techSpace techspace.TechSpace
statService debugstat.StatService
readLimit uint32
writeLimit uint32
}
func (s *spaceStatus) ProvideStat() any {
@ -120,8 +122,10 @@ func (s *spaceStatus) LatestAclHeadId() string {
return s.latestAclHeadId
}
func (s *spaceStatus) SetRemoteStatus(ctx context.Context, status spaceinfo.RemoteStatus) error {
s.remoteStatus = status
func (s *spaceStatus) SetRemoteStatus(ctx context.Context, status spaceinfo.SpaceRemoteStatusInfo) error {
s.remoteStatus = status.RemoteStatus
s.readLimit = status.ReadLimit
s.writeLimit = status.WriteLimit
return s.setCurrentLocalInfo(ctx)
}
@ -172,6 +176,8 @@ func (s *spaceStatus) setCurrentLocalInfo(ctx context.Context) (err error) {
SpaceID: s.spaceId,
LocalStatus: s.localStatus,
RemoteStatus: s.remoteStatus,
ReadLimit: s.readLimit,
WriteLimit: s.writeLimit,
})
}

View file

@ -84,7 +84,7 @@ func (s *spaceController) SetInfo(ctx context.Context, info spaceinfo.SpacePersi
return nil
}
func (s *spaceController) UpdateRemoteStatus(ctx context.Context, status spaceinfo.RemoteStatus) error {
func (s *spaceController) UpdateRemoteStatus(ctx context.Context, status spaceinfo.SpaceRemoteStatusInfo) error {
return nil
}

View file

@ -38,7 +38,7 @@ type spaceController struct {
techSpace techspace.TechSpace
}
func (s *spaceController) UpdateRemoteStatus(ctx context.Context, status spaceinfo.RemoteStatus) error {
func (s *spaceController) UpdateRemoteStatus(ctx context.Context, status spaceinfo.SpaceRemoteStatusInfo) error {
return nil
}

View file

@ -114,7 +114,7 @@ func (s *spaceController) UpdateInfo(ctx context.Context, info spaceinfo.SpacePe
}
}
func (s *spaceController) UpdateRemoteStatus(ctx context.Context, status spaceinfo.RemoteStatus) error {
func (s *spaceController) UpdateRemoteStatus(ctx context.Context, status spaceinfo.SpaceRemoteStatusInfo) error {
s.status.Lock()
defer s.status.Unlock()
return s.status.SetRemoteStatus(ctx, status)

View file

@ -94,8 +94,8 @@ func (s *spaceStatusMock) UpdatePersistentStatus(ctx context.Context, status spa
s.accountStatus = status
}
func (s *spaceStatusMock) SetRemoteStatus(ctx context.Context, status spaceinfo.RemoteStatus) error {
s.remoteStatus = status
func (s *spaceStatusMock) SetRemoteStatus(ctx context.Context, status spaceinfo.SpaceRemoteStatusInfo) error {
s.remoteStatus = status.RemoteStatus
return nil
}

View file

@ -14,7 +14,7 @@ type SpaceController interface {
Current() any
UpdateInfo(ctx context.Context, info spaceinfo.SpacePersistentInfo) error
SetInfo(ctx context.Context, info spaceinfo.SpacePersistentInfo) error
UpdateRemoteStatus(ctx context.Context, status spaceinfo.RemoteStatus) error
UpdateRemoteStatus(ctx context.Context, status spaceinfo.SpaceRemoteStatusInfo) error
Close(ctx context.Context) error
}

View file

@ -233,20 +233,20 @@ func (s *service) AccountMetadataPayload() []byte {
return s.accountMetadataPayload
}
func (s *service) UpdateRemoteStatus(ctx context.Context, spaceId string, status spaceinfo.RemoteStatus, isOwned bool) error {
func (s *service) UpdateRemoteStatus(ctx context.Context, status spaceinfo.SpaceRemoteStatusInfo) error {
s.mu.Lock()
ctrl := s.spaceControllers[spaceId]
ctrl := s.spaceControllers[status.SpaceId]
s.mu.Unlock()
if ctrl == nil {
return fmt.Errorf("no such space: %s", spaceId)
return fmt.Errorf("no such space: %s", status.SpaceId)
}
err := ctrl.UpdateRemoteStatus(ctx, status)
if err != nil {
return fmt.Errorf("updateRemoteStatus: %w", err)
}
if !isOwned && status == spaceinfo.RemoteStatusDeleted {
if !status.IsOwned && status.RemoteStatus == spaceinfo.RemoteStatusDeleted {
return ctrl.SetInfo(ctx, spaceinfo.SpacePersistentInfo{
SpaceID: spaceId,
SpaceID: status.SpaceId,
AccountStatus: spaceinfo.AccountStatusRemoving,
})
}

View file

@ -81,10 +81,20 @@ func (a AccountStatus) String() string {
return ""
}
type SpaceRemoteStatusInfo struct {
SpaceId string
RemoteStatus RemoteStatus
WriteLimit uint32
ReadLimit uint32
IsOwned bool
}
type SpaceLocalInfo struct {
SpaceID string
LocalStatus LocalStatus
RemoteStatus RemoteStatus
WriteLimit uint32
ReadLimit uint32
}
type SpacePersistentInfo struct {