Skip to content

Commit 493ba3f

Browse files
committed
fix: Demote connection media validations (at least temporarily)
Errors thrown during Media retrievals no longer terminate the connection process, but output the error instead. logging: Hide no-mediainfo ref-count warnings logging: Add error context to PartitionConnection media ops
1 parent f1418e0 commit 493ba3f

File tree

5 files changed

+52
-18
lines changed

5 files changed

+52
-18
lines changed

packages/prophet/Oracle/_connectionOps.js

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import type ValaaURI from "~/raem/ValaaURI";
66
import type { NarrateOptions } from "~/prophet/api/Prophet";
77
import PartitionConnection from "~/prophet/api/PartitionConnection";
88

9-
import { invariantifyNumber, vdon } from "~/tools";
9+
import { dumpObject, invariantifyNumber, isPromise, vdon } from "~/tools";
1010

1111
import Oracle from "./Oracle";
1212
import OraclePartitionConnection from "./OraclePartitionConnection";
@@ -86,15 +86,14 @@ export async function _connect (connection: OraclePartitionConnection,
8686
throw new Error(`Existing actions found when trying to create a new partition '${
8787
connection.partitionURI().toString()}'`);
8888
}
89-
9089
if ((onConnectData.requireLatestMediaContents !== false)
9190
&& (ret.mediaRetrievalStatus || { latestFailures: [] }).latestFailures.length) {
92-
throw new Error(`Failed to connect to partition: encountered ${
93-
onConnectData.mediaRetrievalStatus.latestFailures.length
91+
// FIXME(iridian): This error temporarily demoted to log error
92+
connection.outputErrorEvent(new Error(`Failed to connect to partition: encountered ${
93+
ret.mediaRetrievalStatus.latestFailures.length
9494
} latest media content retrieval failures (and acquirePartitionConnection.${
95-
""}options.requireLatestMediaContents does not equal false).`);
95+
""}options.requireLatestMediaContents does not equal false).`));
9696
}
97-
9897
connection._isConnected = true;
9998
return ret;
10099
}
@@ -133,19 +132,35 @@ export async function _narrateEventLog (connection: OraclePartitionConnection,
133132
const collection = connection.createReceiveTruthCollection("initialAuthorityNarration", {
134133
retrieveBatchContents: authorityConnection.requestMediaContents.bind(authorityConnection),
135134
});
135+
136136
const authorityNarration = Promise.resolve(authorityConnection.narrateEventLog({
137137
narrateRemote: true, subscribeRemote: options.subscribeRemote,
138138
firstEventId: connection._lastAuthorizedEventId + 1,
139139
callback: collection.receiveTruth,
140140
})).then(async (remoteNarration) =>
141141
((await collection.finalize(remoteNarration)) || remoteNarration));
142+
142143
if ((options.fullNarrate === true) || (!(ret.eventLog || []).length
143144
&& !(ret.scribeEventLog || []).length && !(ret.scribeCommandQueue || []).length)) {
144145
// Handle step 2 of the opportunistic narration if local narration didn't find any events.
145146
const authorityResults = await authorityNarration;
146147
for (const key of Object.keys(authorityResults)) {
147-
if (Array.isArray(authorityResults[key])) {
148-
authorityResults[key] = await Promise.all(authorityResults[key]);
148+
const resultEntry = authorityResults[key];
149+
if (!Array.isArray(resultEntry)) continue;
150+
for (let i = 0; i !== resultEntry.length; ++i) {
151+
const value = resultEntry[i];
152+
if (!isPromise(value)) continue;
153+
try {
154+
resultEntry[i] = await value;
155+
} catch (error) {
156+
const wrapped = connection.wrapErrorEvent(error,
157+
`narrateEventLog.authorityResults[${key}][${i}]`,
158+
"\n\toptions:", ...dumpObject(options),
159+
"\n\tcurrent ret:", ...dumpObject(ret));
160+
if (error.blocksNarration) throw wrapped;
161+
connection.outputErrorEvent(wrapped);
162+
resultEntry[i] = wrapped;
163+
}
149164
}
150165
}
151166
ret.mediaRetrievalStatus = collection.analyzeRetrievals();

packages/prophet/Oracle/_downstreamOps.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,9 @@ export function _createReceiveTruthCollection (connection: OraclePartitionConnec
7878
if (pendingRetrieval) pendingRetrievals.push(ofMedia.ongoingRetrieval.pendingContent);
7979
}
8080
if (!pendingRetrievals.length) break; // No retrieval queue, no pending retrievals - finish.
81-
await Promise.all(pendingRetrievals);
81+
try { await Promise.all(pendingRetrievals); } catch (error) {
82+
// Ignore retrieval failures - we're just waiting for graceful retries.
83+
}
8284
}
8385
}
8486
};
@@ -126,7 +128,7 @@ export function _createReceiveTruthCollection (connection: OraclePartitionConnec
126128
mediaInfo.name}), ${thisRetrieval.retries}. attempt`;
127129
if (thisRetrieval.retries <= _maxOnConnectRetrievalRetries) {
128130
connection.warnEvent(`${description} retrying after ignoring an exception: ${
129-
error.originalMessage || error.message}`);
131+
error.originalMessage || error.message}`, ...dumpObject({ error }));
130132
} else {
131133
thisRetrieval.error = connection.wrapErrorEvent(error, description,
132134
"\n\tretrievals:", ...dumpObject(collection.retrievals),

packages/prophet/Oracle/_mediaOps.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,10 @@ export function _requestMediaContents (connection: OraclePartitionConnection,
4747
}
4848
ret = retrieveMediaContent(mediaInfo.mediaId, mediaInfo);
4949
if (ret !== undefined) {
50+
// Initiate write but don't wait for it to complete. (really?).
5051
thenChainEagerly(ret,
5152
(content) => _prepareBvob(connection, content, mediaInfo, { remotePersist: false }),
52-
onError.bind(this));
53+
onError);
5354
}
5455
return ret;
5556
});

packages/prophet/Scribe/_databaseOps.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -113,17 +113,17 @@ export function _persistMediaEntry (connection: ScribePartitionConnection, newMe
113113
// TODO(iridian): Are there race conditions here? The refcount operations are not awaited on
114114
if (newInfo.bvobId) {
115115
if (!connection._prophet._bvobLookup[newInfo.bvobId]) {
116-
console.log(`Can't find Media "${newInfo.name}" Bvob info for ${newInfo.bvobId
117-
} when adding new content references`);
116+
// console.log(`Can't find Media "${newInfo.name}" Bvob info for ${newInfo.bvobId
117+
// } when adding new content references`);
118118
} else {
119119
if (newMediaEntry.isInMemory) connection._prophet._addContentInMemoryReference(newInfo);
120120
if (newMediaEntry.isPersisted) connection._prophet._addContentPersistReference(newInfo);
121121
}
122122
}
123123
if (oldBvobId) {
124124
if (!connection._prophet._bvobLookup[oldBvobId]) {
125-
console.log(`Can't find Media "${newInfo.name}" Bvob info for ${oldBvobId
126-
} when removing old content references`);
125+
// console.log(`Can't find Media "${newInfo.name}" Bvob info for ${oldBvobId
126+
// } when removing old content references`);
127127
} else {
128128
if (oldEntry.isInMemory) connection._prophet._removeContentInMemoryReference(oldBvobId);
129129
if (oldEntry.isPersisted) connection._prophet._removeContentPersistReference(oldBvobId);

packages/prophet/api/PartitionConnection.js

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,12 @@ export default class PartitionConnection extends LogEventGenerator {
164164
delete mediaInfo.mime;
165165
delete mediaInfo.type;
166166
delete mediaInfo.subtype;
167-
return thenChainEagerly(this.requestMediaContents([mediaInfo]), results => results[0]);
167+
return thenChainEagerly(
168+
this.requestMediaContents([mediaInfo]),
169+
results => results[0],
170+
(error) => this.wrapErrorEvent(error, `readMediaContent(${mediaInfo.name})`,
171+
"\n\tmediaInfo:", ...dumpObject(mediaInfo))
172+
);
168173
}
169174

170175
/**
@@ -187,7 +192,13 @@ export default class PartitionConnection extends LogEventGenerator {
187192
`decodeMediaContent('${mediaInfo.name || "<unnamed>"}')`,
188193
"\n\tmediaInfo:", ...dumpObject(mediaInfo));
189194
}
190-
return thenChainEagerly(this.requestMediaContents([mediaInfo]), results => results[0]);
195+
return thenChainEagerly(
196+
this.requestMediaContents([mediaInfo]),
197+
results => results[0],
198+
(error) => this.wrapErrorEvent(error, `decodeMediaContent(${mediaInfo.name} as ${
199+
mediaInfo.mime})`,
200+
"\n\tmediaInfo:", ...dumpObject(mediaInfo)),
201+
);
191202
}
192203

193204
/**
@@ -204,7 +215,12 @@ export default class PartitionConnection extends LogEventGenerator {
204215
*/
205216
getMediaURL (mediaInfo: MediaInfo): any {
206217
if (!mediaInfo.asURL) mediaInfo.asURL = true;
207-
return thenChainEagerly(this.requestMediaContents([mediaInfo]), results => results[0]);
218+
return thenChainEagerly(
219+
this.requestMediaContents([mediaInfo]),
220+
results => results[0],
221+
(error) => this.wrapErrorEvent(error, `getMediaURL(${mediaInfo.name})`,
222+
"\n\tmediaInfo:", ...dumpObject(mediaInfo)),
223+
);
208224
}
209225

210226
requestMediaContents (mediaInfos: MediaInfo[]): Promise<(Promise | any)[]> | (Promise | any)[] {

0 commit comments

Comments
 (0)