Skip to content

Commit

Permalink
Merge branch 'master' into colossus-beta
Browse files Browse the repository at this point in the history
  • Loading branch information
mnaamani committed Nov 30, 2023
2 parents 479e36b + c38cef0 commit 5a91abe
Show file tree
Hide file tree
Showing 25 changed files with 457 additions and 79 deletions.
10 changes: 0 additions & 10 deletions distributor-node/src/services/networking/query-node/schema.graphql
Original file line number Diff line number Diff line change
Expand Up @@ -2029,7 +2029,6 @@ type MemberMetadata implements BaseGraphQLObject {
member: Membership
externalResources: [MembershipExternalResource!]
isVerifiedValidator: Boolean
validatorAccount: String
membercreatedeventmetadata: [MemberCreatedEvent!]
memberinvitedeventmetadata: [MemberInvitedEvent!]
memberprofileupdatedeventnewMetadata: [MemberProfileUpdatedEvent!]
Expand Down Expand Up @@ -17745,11 +17744,6 @@ input MemberMetadataWhereInput {
about_in: [String!]
isVerifiedValidator_eq: Boolean
isVerifiedValidator_in: [Boolean!]
validatorAccount_eq: String
validatorAccount_contains: String
validatorAccount_startsWith: String
validatorAccount_endsWith: String
validatorAccount_in: [String!]
member: MembershipWhereInput
externalResources_none: MembershipExternalResourceWhereInput
externalResources_some: MembershipExternalResourceWhereInput
Expand Down Expand Up @@ -17783,15 +17777,13 @@ input MemberMetadataCreateInput {
avatar: JSONObject!
about: String
isVerifiedValidator: Boolean
validatorAccount: String
}

input MemberMetadataUpdateInput {
name: String
avatar: JSONObject
about: String
isVerifiedValidator: Boolean
validatorAccount: String
}

input MembershipGiftedEventWhereInput {
Expand Down Expand Up @@ -30510,8 +30502,6 @@ enum MemberMetadataOrderByInput {
about_DESC
isVerifiedValidator_ASC
isVerifiedValidator_DESC
validatorAccount_ASC
validatorAccount_DESC
}

enum MemberProfileUpdatedEventOrderByInput {
Expand Down
5 changes: 0 additions & 5 deletions metadata-protobuf/proto/Membership.proto
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,5 @@ message MembershipMetadata {
optional ResourceType type = 1;
optional string value = 2;
}

repeated ExternalResource externalResources = 5;

optional string validatorAccount = 6;
}


9 changes: 1 addition & 8 deletions query-node/mappings/src/membership.ts
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,6 @@ async function saveMembershipMetadata(
avatar,
externalResources: undefined,
isVerifiedValidator: false,
validatorAccount: metadata?.validatorAccount || undefined,
})

await store.save<MemberMetadata>(metadataEntity)
Expand Down Expand Up @@ -347,13 +346,7 @@ export async function members_MemberProfileUpdated({ store, event }: EventContex
}
}

if (
typeof metadata?.validatorAccount === 'string' &&
metadata.validatorAccount !== member.metadata.validatorAccount
) {
member.metadata.validatorAccount = (metadata.validatorAccount || null) as string | undefined
member.metadata.isVerifiedValidator = false
}
member.metadata.isVerifiedValidator = false

if (newHandle.isSome) {
setMemberHandle(member, newHandle.unwrap())
Expand Down
1 change: 0 additions & 1 deletion query-node/schemas/membership.graphql
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,6 @@ type MemberMetadata @entity {
externalResources: [MembershipExternalResource] @derivedFrom(field: "memberMetadata")

isVerifiedValidator: Boolean
validatorAccount: String
}

type MembershipEntryPaid @variant {
Expand Down
3 changes: 3 additions & 0 deletions storage-node/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
### 3.9.0

- Add background pruning worker to delete data objects which the node is no longer obligated to store. New optional argument `--cleanup` and `--cleanupInterval`
- Added new `AcceptPendingObjectsService` that is responsible for periodically sending batch `accept_pending_data_objects` for all the pending data objects. The `POST /files` endpoint now no longer calls the `accept_pending_data_objects` extrinsic for individual uploads, instead, it registers all the pending objects with `AcceptPendingObjectsService`
- Updated `/state/data` endpoint response headers to return data objects status too i.e. (`pending` or `accepted`)
- **FIX**: Increase the default timeout value in the `extrinsicWrapper` function to match the transaction validity in the transaction pool

### 3.8.1

Expand Down
2 changes: 1 addition & 1 deletion storage-node/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "storage-node",
"description": "Joystream storage subsystem.",
"version": "3.9.0-beta-2",
"version": "3.9.0",
"author": "Joystream contributors",
"bin": {
"storage-node": "./bin/run"
Expand Down
6 changes: 6 additions & 0 deletions storage-node/src/api-spec/openapi.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -281,6 +281,12 @@ components:
tempDownloads:
type: integer
format: int64
pendingDirSize:
type: integer
format: int64
pendingObjects:
type: integer
format: int64
VersionResponse:
type: object
required:
Expand Down
26 changes: 24 additions & 2 deletions storage-node/src/commands/server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,9 @@ import {
MINIMUM_REPLICATION_THRESHOLD,
performCleanup,
} from '../services/sync/cleanupService'
import { AcceptPendingObjectsService } from '../services/sync/acceptPendingObjects'
import { getStorageBucketIdsByWorkerId } from '../services/sync/storageObligations'
import { TempDirName, performSync } from '../services/sync/synchronizer'
import { PendingDirName, performSync, TempDirName } from '../services/sync/synchronizer'
import { createApp } from '../services/webApi/app'
import ExitCodes from './../command-base/ExitCodes'
const fsPromises = fs.promises
Expand Down Expand Up @@ -141,6 +142,11 @@ Supported values: warn, error, debug, info. Default:debug`,
default: 'daily',
required: false,
}),
maxBatchTxSize: flags.integer({
description: 'Maximum number of `accept_pending_data_objects` in a batch transactions.',
default: 10,
required: false,
}),
...ApiCommandBase.flags,
}

Expand Down Expand Up @@ -212,13 +218,27 @@ Supported values: warn, error, debug, info. Default:debug`,
await recreateTempDirectory(flags.uploads, TempDirName)

if (fs.existsSync(flags.uploads)) {
await loadDataObjectIdCache(flags.uploads, TempDirName)
await loadDataObjectIdCache(flags.uploads, TempDirName, PendingDirName)
}

if (flags.dev) {
await this.ensureDevelopmentChain()
}

const pendingDataObjectsDir = path.join(flags.uploads, PendingDirName)

const acceptPendingObjectsService = await AcceptPendingObjectsService.create(
api,
qnApi,
workerId,
flags.uploads,
pendingDataObjectsDir,
bucketKeyPairs,
writableBuckets,
flags.maxBatchTxSize,
6000 // Every block
)

// Don't run sync job if no buckets selected, to prevent purging
// any assets.
if (flags.sync && selectedBuckets.length) {
Expand Down Expand Up @@ -279,6 +299,8 @@ Supported values: warn, error, debug, info. Default:debug`,
maxFileSize,
uploadsDir: flags.uploads,
tempFileUploadingDir,
pendingDataObjectsDir,
acceptPendingObjectsService,
process: this.config,
enableUploadingAuth,
downloadBuckets: selectedBuckets,
Expand Down
13 changes: 10 additions & 3 deletions storage-node/src/services/caching/localDataObjects.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,13 +34,20 @@ export async function getDataObjectIDs(): Promise<string[]> {
* @param uploadDir - uploading directory
* @param tempDirName - temp directory name
*/
export async function loadDataObjectIdCache(uploadDir: string, tempDirName: string): Promise<void> {
export async function loadDataObjectIdCache(
uploadDir: string,
tempDirName: string,
pendingDirName: string
): Promise<void> {
await lock.acquireAsync()

const localIds = await getLocalFileNames(uploadDir)
// Filter temporary directory name.
// Filter temporary & pending directory name.
const tempDirectoryName = path.parse(tempDirName).name
const ids = localIds.filter((dataObjectId) => dataObjectId !== tempDirectoryName)
const pendingDirectoryName = path.parse(pendingDirName).name
const ids = localIds.filter(
(dataObjectId) => dataObjectId !== tempDirectoryName && dataObjectId !== pendingDirectoryName
)

ids.forEach((id) => idCache.set(id, 0))
logger.debug(`Local ID cache loaded.`)
Expand Down
29 changes: 29 additions & 0 deletions storage-node/src/services/queryNode/api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,13 @@ import {
GetDataObjectsConnection,
GetDataObjectsConnectionQuery,
GetDataObjectsConnectionQueryVariables,
DataObjectsWithBagAndBucketsFragment,
// GetDataObjectConnection,
// GetDataObjectConnectionQuery,
// GetDataObjectConnectionQueryVariables,
GetDataObjectsByIds,
GetDataObjectsByIdsQuery,
GetDataObjectsByIdsQueryVariables,
GetStorageBucketDetails,
GetStorageBucketDetailsByWorkerId,
GetStorageBucketDetailsByWorkerIdQuery,
Expand Down Expand Up @@ -347,6 +354,28 @@ export class QueryNodeApi {
return fullResult
}

/**
* Returns data objects info by IDs.
*
* @param bagIds - query filter: data object IDs
*/
public async getDataObjectsByIds(ids: string[]): Promise<Array<DataObjectsWithBagAndBucketsFragment>> {
const allIds = [...ids] // Copy to avoid modifying the original array
const fullResult: DataObjectsWithBagAndBucketsFragment[] = []
while (allIds.length) {
const idsBatch = allIds.splice(0, 1000)
fullResult.push(
...((await this.multipleEntitiesQuery<GetDataObjectsByIdsQuery, GetDataObjectsByIdsQueryVariables>(
GetDataObjectsByIds,
{ limit: MAX_RESULTS_PER_QUERY, ids: idsBatch },
'storageDataObjects'
)) || [])
)
}

return fullResult
}

/**
* Returns storage bucket IDs.
*
Expand Down
17 changes: 17 additions & 0 deletions storage-node/src/services/queryNode/queries/queries.graphql
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,23 @@ query getDataObjectsConnection($dataObjectIds: [ID!], $limit: Int, $cursor: Stri
}
}

fragment DataObjectsWithBagAndBuckets on StorageDataObject {
id
isAccepted
storageBag {
id
storageBuckets {
id
}
}
}

query getDataObjectsByIds($ids: [ID!], $limit: Int) {
storageDataObjects(where: { id_in: $ids }, limit: $limit) {
...DataObjectsWithBagAndBuckets
}
}

fragment QueryNodeStateFields on ProcessorState {
chainHead
lastCompleteBlock
Expand Down
10 changes: 0 additions & 10 deletions storage-node/src/services/queryNode/schema.graphql
Original file line number Diff line number Diff line change
Expand Up @@ -2029,7 +2029,6 @@ type MemberMetadata implements BaseGraphQLObject {
member: Membership
externalResources: [MembershipExternalResource!]
isVerifiedValidator: Boolean
validatorAccount: String
membercreatedeventmetadata: [MemberCreatedEvent!]
memberinvitedeventmetadata: [MemberInvitedEvent!]
memberprofileupdatedeventnewMetadata: [MemberProfileUpdatedEvent!]
Expand Down Expand Up @@ -17745,11 +17744,6 @@ input MemberMetadataWhereInput {
about_in: [String!]
isVerifiedValidator_eq: Boolean
isVerifiedValidator_in: [Boolean!]
validatorAccount_eq: String
validatorAccount_contains: String
validatorAccount_startsWith: String
validatorAccount_endsWith: String
validatorAccount_in: [String!]
member: MembershipWhereInput
externalResources_none: MembershipExternalResourceWhereInput
externalResources_some: MembershipExternalResourceWhereInput
Expand Down Expand Up @@ -17783,15 +17777,13 @@ input MemberMetadataCreateInput {
avatar: JSONObject!
about: String
isVerifiedValidator: Boolean
validatorAccount: String
}

input MemberMetadataUpdateInput {
name: String
avatar: JSONObject
about: String
isVerifiedValidator: Boolean
validatorAccount: String
}

input MembershipGiftedEventWhereInput {
Expand Down Expand Up @@ -30510,8 +30502,6 @@ enum MemberMetadataOrderByInput {
about_DESC
isVerifiedValidator_ASC
isVerifiedValidator_DESC
validatorAccount_ASC
validatorAccount_DESC
}

enum MemberProfileUpdatedEventOrderByInput {
Expand Down
Loading

0 comments on commit 5a91abe

Please sign in to comment.