Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "kodo-browser",
"version": "2.3.1",
"version": "2.3.2",
"license": "Apache-2.0",
"author": {
"name": "Rong Zhou",
Expand Down Expand Up @@ -111,7 +111,7 @@
"form-data": "^4.0.0",
"js-base64": "^3.4.5",
"js-md5": "^0.7.3",
"kodo-s3-adapter-sdk": "0.6.1",
"kodo-s3-adapter-sdk": "0.7.0",
"lockfile": "^1.0.4",
"lodash": "^4.17.21",
"mime": "^2.3.1",
Expand Down
16 changes: 16 additions & 0 deletions src/common/ipc-actions/upload.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ export interface DestInfo {
}

export interface UploadOptions {
accelerateUploading: boolean,
isOverwrite: boolean,
storageClassName: StorageClass["kodoName"],
storageClasses: StorageClass[],
Expand All @@ -36,6 +37,7 @@ export enum UploadAction {
StopJobsByOffline = "StopJobsByOffline",
StartJobsByOnline = "StartJobsByOnline",
RemoveAllJobs = "RemoveAllJobs",
ClearRegionsCache = "ClearRegionsCache",

// common
UpdateUiData = "UpdateUiData",
Expand Down Expand Up @@ -177,6 +179,11 @@ export interface RemoveAllJobsMessage {
data?: {},
}

export interface ClearRegionsCacheMessage {
action: UploadAction.ClearRegionsCache,
data?: {},
}

export interface JobCompletedReplyMessage {
action: UploadAction.JobCompleted,
data: {
Expand Down Expand Up @@ -207,6 +214,7 @@ export type UploadMessage = UpdateConfigMessage
| StopJobsByOfflineMessage
| StartJobsByOnlineMessage
| RemoveAllJobsMessage
| ClearRegionsCacheMessage

export type UploadReplyMessage = UpdateUiDataReplyMessage
| AddedJobsReplyMessage
Expand Down Expand Up @@ -318,4 +326,12 @@ export class UploadActionFns {
data: {},
});
}

clearRegionsCache() {
// if only ucUrl and s3RegionId are provided,
// it will clear all regions cache
this.sender.send(this.channel, {
action: UploadAction.ClearRegionsCache,
});
}
}
17 changes: 17 additions & 0 deletions src/common/models/job/upload-job.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ interface RequiredOptions {
}

interface UploadOptions {
accelerateUploading: boolean,
multipartUploadThreshold: number, // Bytes
multipartUploadSize: number, // Bytes
multipartUploadConcurrency: number,
Expand Down Expand Up @@ -65,6 +66,7 @@ export type Options = RequiredOptions & Partial<OptionalOptions>
const DEFAULT_OPTIONS: OptionalOptions = {
id: "",

accelerateUploading: false,
multipartUploadThreshold: 10 * ByteSize.MB,
multipartUploadSize: 4 * ByteSize.MB,
multipartUploadConcurrency: 1,
Expand Down Expand Up @@ -100,6 +102,7 @@ type PersistInfo = {
// But It's also a risk, if business logic changes. Because we may get errors
// when restart job from break point with different backendMode.
backendMode: RequiredOptions["clientOptions"]["backendMode"],
accelerateUploading: OptionalOptions["accelerateUploading"],
prog: OptionalOptions["prog"],
status: Exclude<OptionalOptions["status"], Status.Waiting | Status.Running>,
message: OptionalOptions["message"],
Expand Down Expand Up @@ -137,6 +140,7 @@ export default class UploadJob extends TransferJob {
prog: persistInfo.prog,

clientOptions,
accelerateUploading: persistInfo.accelerateUploading,
storageClasses: persistInfo.storageClasses,

overwrite: persistInfo.overwrite,
Expand All @@ -162,6 +166,9 @@ export default class UploadJob extends TransferJob {
protected readonly options: Readonly<RequiredOptions & OptionalOptions>
private isForceOverwrite: boolean = false

// - for accelerate uploading
accelerateUploading: boolean = false

// - for resume from break point -
uploadedId: string
uploadedParts: UploadedPart[]
Expand All @@ -174,6 +181,7 @@ export default class UploadJob extends TransferJob {

this.options = lodash.merge({}, DEFAULT_OPTIONS, config);

this.accelerateUploading = this.options.accelerateUploading;
this.uploadedId = this.options.uploadedId;
this.uploadedParts = [
...this.options.uploadedParts,
Expand All @@ -193,6 +201,7 @@ export default class UploadJob extends TransferJob {
...super.uiData,
from: this.options.from,
to: this.options.to,
accelerateUploading: this.accelerateUploading,
};
}

Expand Down Expand Up @@ -276,6 +285,7 @@ export default class UploadJob extends TransferJob {
header: {
contentType: mime.getType(this.options.from.path),
},
accelerateUploading: this.accelerateUploading,
recovered: this.uploadedId && this.uploadedParts
? {
uploadId: this.uploadedId,
Expand Down Expand Up @@ -419,6 +429,7 @@ export default class UploadJob extends TransferJob {
overwrite: this.options.overwrite,
storageClassName: this.options.storageClassName,
backendMode: this.options.clientOptions.backendMode,
accelerateUploading: this.options.accelerateUploading,

// real-time info
prog: {
Expand Down Expand Up @@ -480,6 +491,12 @@ export default class UploadJob extends TransferJob {
this.uploadedId = "";
this.uploadedParts = [];
}
// handle accelerate uploading is not available
if (err.toString().includes("transfer acceleration is not configured")) {
this.accelerateUploading = false;
await this.retry();
return;
}

this._status = Status.Failed;
this.message = err.toString();
Expand Down
1 change: 1 addition & 0 deletions src/common/qiniu/_mock-helpers_/data.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import { Region } from "kodo-s3-adapter-sdk";

const mockDataOfRegionBase = {
upUrls: [],
upAccUrls: [],
ucUrls: [],
rsUrls: [],
rsfUrls: [],
Expand Down
6 changes: 6 additions & 0 deletions src/main/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -257,6 +257,9 @@ ipcMain.on("UploaderManager", (event, message) => {
{
cwd: root,
silent: false,
execArgv: process.env.NODE_ENV === "development"
? ["--inspect=9222"]
: [],
},
);
forkedWorkers.set(processName, uploaderProcess);
Expand Down Expand Up @@ -294,6 +297,9 @@ ipcMain.on("DownloaderManager", (event, message) => {
{
cwd: root,
silent: false,
execArgv: process.env.NODE_ENV === "development"
? ["--inspect=9223"]
: [],
},
);
forkedWorkers.set(processName, downloaderProcess);
Expand Down
6 changes: 3 additions & 3 deletions src/main/kv-store/data-store.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,9 +45,9 @@ export class DataStore<T> {

constructor({
workingDirectory,
thresholdDuration,
thresholdSize,
thresholdChangesSize,
thresholdDuration, // ms, trigger compact when thresholdDuration elapsed after last compact
thresholdSize, // trigger compact when memTable size exceeds thresholdSize
thresholdChangesSize, // trigger compact when memTable changes size exceeds thresholdChangesSize

memTable,
memTableReadOnly,
Expand Down
1 change: 1 addition & 0 deletions src/main/transfer-managers/upload-manager.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ describe("test createUploadJobs", () => {
};

const MOCKED_UPLOAD_OPTIONS: UploadOptions = {
accelerateUploading: false,
isOverwrite: true,
storageClassName: "Standard",
storageClasses: [
Expand Down
1 change: 1 addition & 0 deletions src/main/transfer-managers/upload-manager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -244,6 +244,7 @@ export default class UploadManager extends TransferManager<UploadJob, Config> {
},

clientOptions,
accelerateUploading: uploadOptions.accelerateUploading,
storageClasses: uploadOptions.storageClasses,

overwrite: uploadOptions.isOverwrite,
Expand Down
5 changes: 5 additions & 0 deletions src/main/upload-worker.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import {Region} from "kodo-s3-adapter-sdk";
import {KodoHttpClient} from "kodo-s3-adapter-sdk/dist/kodo-http-client";

import {
AddedJobsReplyMessage,
Expand Down Expand Up @@ -139,6 +140,10 @@ process.on("message", (message: UploadMessage) => {
uploadManager.removeAllJobs();
break;
}
case UploadAction.ClearRegionsCache: {
KodoHttpClient.clearCache();
break;
}
default: {
console.warn("Upload Manager received unknown action, message:", message);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ const ChangeStorageClassForm: React.FC<ChangeStorageClassFormProps> = ({

useEffect(() => {
reset({
storageClassKodoName: availableStorageClasses[0].kodoName,
storageClassKodoName: availableStorageClasses[0].kodoName ?? "Standard",
});
}, []);

Expand Down
25 changes: 13 additions & 12 deletions src/renderer/components/modals/file/create-dir-share-link/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -115,20 +115,23 @@ const CreateDirShareLink: React.FC<ModalProps & CreateDirShareLinkProps> = (prop
return;
}

let apiUrls: string[] = [];
let shareURL = new URL(`${DEFAULT_PORTAL_URL}/kodo-shares/verify`);
let portalOrigin = shareURL.origin;
const customShareUrl = currentUser.endpointType === EndpointType.Private
? DefaultDict.get("BASE_SHARE_URL")
: undefined;
if (customShareUrl) {
const parsedShareUrl = new URL(customShareUrl);
let customApiUrls: string[] = [];
try {
customApiUrls = await getShareApiHosts([parsedShareUrl.origin]);
} catch (err: any) {
toast.error(err.toString());
return;

let apiUrls: string[] = [];
try {
if (customShareUrl) {
shareURL = new URL(customShareUrl);
}
apiUrls = apiUrls.concat(customApiUrls);

portalOrigin = shareURL.origin;
apiUrls = await getShareApiHosts([portalOrigin]);
} catch (err: any) {
toast.error(err.toString());
return;
}

const p = createShare(
Expand All @@ -148,8 +151,6 @@ const CreateDirShareLink: React.FC<ModalProps & CreateDirShareLinkProps> = (prop
);

p.then(shareInfo => {
const baseShareUrl = customShareUrl || `${DEFAULT_PORTAL_URL}/kodo-shares/verify`;
const shareURL = new URL(baseShareUrl);
shareURL.searchParams.set("id", shareInfo.id);
shareURL.searchParams.set("token", shareInfo.token);
setShareLink(shareURL.toString());
Expand Down
Loading
Loading